From ccb4bbd1b4201df7941c044eaf1b02cf6d057e6b Mon Sep 17 00:00:00 2001 From: Christopher Serr Date: Mon, 15 Jul 2024 21:14:45 +0200 Subject: [PATCH] Introduce a Tauri based desktop version (#940) This introduces a Tauri based desktop version of LiveSplit One. For now very few changes have been done. It's mostly global hotkeys that work now. It's unclear if Tauri is the long term solution for LiveSplit One, but it gets us global hotkeys and auto splitting with very little effort, so we'll use it until something better comes along. --- .github/workflows/ci.yml | 288 +- livesplit-core | 2 +- package-lock.json | 189 + package.json | 7 +- src-tauri/.gitignore | 9 + src-tauri/Cargo.lock | 4636 +++++++++++++++++ src-tauri/Cargo.toml | 28 + src-tauri/build.rs | 3 + src-tauri/src/main.rs | 225 + src-tauri/tauri.conf.json | 43 + src/assets/icon.png | Bin 0 -> 108479 bytes src/index.tsx | 2 +- src/layout/Layout.tsx | 2 +- src/platform/CORS.ts | 15 + src/platform/Hotkeys.ts | 85 + src/storage/index.tsx | 6 +- src/type-definitions/tauri.d.ts | 46 + src/ui/HotkeyButton.tsx | 28 +- src/ui/LayoutEditor.tsx | 2 +- src/ui/LayoutView.tsx | 4 +- src/ui/LiveSplit.tsx | 55 +- .../{SettingsEditor.tsx => MainSettings.tsx} | 8 +- src/ui/RunEditor.tsx | 9 +- src/ui/SplitsSelection.tsx | 4 +- src/ui/TimerView.tsx | 6 +- webpack.config.js | 21 +- 26 files changed, 5549 insertions(+), 174 deletions(-) create mode 100644 src-tauri/.gitignore create mode 100644 src-tauri/Cargo.lock create mode 100644 src-tauri/Cargo.toml create mode 100644 src-tauri/build.rs create mode 100644 src-tauri/src/main.rs create mode 100644 src-tauri/tauri.conf.json create mode 100644 src/assets/icon.png create mode 100644 src/platform/CORS.ts create mode 100644 src/platform/Hotkeys.ts create mode 100644 src/type-definitions/tauri.d.ts rename src/ui/{SettingsEditor.tsx => MainSettings.tsx} (98%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 235d2ff6..1aa2f391 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,115 +4,189 @@ on: pull_request: push: branches: - - 'master' + - "master" jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + label: + - Web + - Tauri on Windows + - Tauri on Linux + - Tauri on macOS ARM + + include: + - label: Web + platform: web + dist_path: dist + os: ubuntu-latest + target: x86_64-unknown-linux-musl + binaryen: x86_64-linux + cargo_bin: /home/runner/.cargo/bin + + - label: Tauri on Windows + platform: tauri + dist_path: src-tauri/target/dist + os: windows-latest + target: x86_64-pc-windows-msvc + binaryen: x86_64-windows + cargo_bin: C:/Users/runneradmin/.cargo/bin + + - label: Tauri on Linux + platform: tauri + dist_path: src-tauri/target/dist + os: ubuntu-latest + target: x86_64-unknown-linux-musl + binaryen: x86_64-linux + cargo_bin: /home/runner/.cargo/bin + + - label: Tauri on macOS ARM + platform: tauri + dist_path: src-tauri/target/dist + os: macos-latest + target: aarch64-apple-darwin + binaryen: arm64-macos + cargo_bin: /Users/runner/.cargo/bin steps: - - name: Checkout commit - uses: actions/checkout@v4 - with: - submodules: recursive - # This forces the entire history to be cloned, which is necessary for - # the changelog generation to work correctly. - fetch-depth: 0 - - - name: Install Node - uses: actions/setup-node@v4 - with: - node-version: 'lts/*' - - - name: Install Rust - uses: hecrj/setup-rust-action@v2 - with: - rust-version: nightly - components: rust-src - targets: wasm32-unknown-unknown - - - name: Download binaryen - if: github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' - uses: robinraju/release-downloader@v1.10 - with: - repository: "WebAssembly/binaryen" - latest: true - fileName: "binaryen-*-x86_64-linux.tar.gz" - out-file-path: "/home/runner/.cargo/bin" - - - name: Install binaryen - if: github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' - run: | - cd ~/.cargo/bin - tar -xzf binaryen-*-x86_64-linux.tar.gz - mv binaryen*/bin/wasm* . - - - name: Choose wasm-bindgen-cli version - run: echo "version=$(cd livesplit-core && cargo tree -i wasm-bindgen --features wasm-web --target wasm32-unknown-unknown --depth 0 | sed 's/.* v//g')" >> $GITHUB_OUTPUT - id: wasm-bindgen - - - name: Download wasm-bindgen-cli - uses: robinraju/release-downloader@v1.9 - with: - repository: "rustwasm/wasm-bindgen" - tag: ${{ steps.wasm-bindgen.outputs.version }} - fileName: "wasm-bindgen-${{ steps.wasm-bindgen.outputs.version }}-x86_64-unknown-linux-musl.tar.gz" - out-file-path: "/home/runner/.cargo/bin" - - - name: Install wasm-bindgen-cli - run: | - cd ~/.cargo/bin - tar -xzf wasm-bindgen-${{ steps.wasm-bindgen.outputs.version }}-x86_64-unknown-linux-musl.tar.gz - mv wasm-bindgen-${{ steps.wasm-bindgen.outputs.version }}-x86_64-unknown-linux-musl/wasm* . - - - name: Install npm packages - run: npm ci -f - env: - DETECT_CHROMEDRIVER_VERSION: true - - - name: Build Core - run: npm run build:core:deploy - - - name: Run eslint - run: npm run lint - - - name: Build Frontend - run: npm run publish - - - name: Cache screenshots - uses: actions/cache@v4 - with: - path: test/screenshots - key: ${{ runner.os }}-screenshots-${{ hashFiles('test/rendering-test.js') }} - restore-keys: ${{ runner.os }}-screenshots- - - - name: Run tests - run: | - echo "::add-matcher::.github/workflows/test-failures.json" - npm run test - - - name: Upload screenshots - if: success() || failure() - uses: actions/upload-artifact@v4 - with: - name: Screenshots - path: test/screenshots - - - name: Optimize - if: github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' - run: | - WASM_FILE=$(ls dist/*.wasm) - wasm-opt --all-features -O4 "$WASM_FILE" -o "$WASM_FILE" - - - name: Add CNAME file - if: github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' - run: cp ./.github/workflows/CNAME ./dist/CNAME - - - name: Deploy - if: github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' - uses: peaceiris/actions-gh-pages@v4 - with: - deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} - publish_branch: gh-pages - publish_dir: ./dist - force_orphan: true + - name: Checkout commit + uses: actions/checkout@v4 + with: + submodules: recursive + # This forces the entire history to be cloned, which is necessary for + # the changelog generation to work correctly. + fetch-depth: 0 + + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: "lts/*" + + - name: Install Rust + uses: hecrj/setup-rust-action@v2 + with: + rust-version: nightly + components: rust-src + targets: wasm32-unknown-unknown + + - name: Download binaryen + if: github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' + uses: robinraju/release-downloader@v1.10 + with: + repository: "WebAssembly/binaryen" + latest: true + fileName: "binaryen-*-${{ matrix.binaryen }}.tar.gz" + out-file-path: ${{ matrix.cargo_bin }} + + - name: Install binaryen + if: github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' + run: | + cd ~/.cargo/bin + tar -xzf binaryen-*-${{ matrix.binaryen }}.tar.gz + mv binaryen*/bin/wasm* . + + - name: Choose wasm-bindgen-cli version + shell: bash + run: echo "version=$(cd livesplit-core && cargo tree -i wasm-bindgen --features wasm-web --target wasm32-unknown-unknown --depth 0 | sed 's/.* v//g')" >> $GITHUB_OUTPUT + id: wasm-bindgen + + - name: Download wasm-bindgen-cli + uses: robinraju/release-downloader@v1.9 + with: + repository: "rustwasm/wasm-bindgen" + tag: ${{ steps.wasm-bindgen.outputs.version }} + fileName: "wasm-bindgen-${{ steps.wasm-bindgen.outputs.version }}-${{ matrix.target }}.tar.gz" + out-file-path: ${{ matrix.cargo_bin }} + + - name: Install wasm-bindgen-cli + shell: bash + run: | + cd ${{ matrix.cargo_bin }} + tar -xzf wasm-bindgen-${{ steps.wasm-bindgen.outputs.version }}-${{ matrix.target }}.tar.gz + mv wasm-bindgen-${{ steps.wasm-bindgen.outputs.version }}-${{ matrix.target }}/wasm* . + + - name: Install npm packages + run: npm ci -f + env: + DETECT_CHROMEDRIVER_VERSION: true + + - name: Install native dependencies (Tauri) + if: matrix.platform == 'tauri' && matrix.os == 'ubuntu-latest' + run: | + sudo apt update + sudo apt install libwebkit2gtk-4.0-dev \ + build-essential \ + curl \ + wget \ + file \ + libssl-dev \ + libgtk-3-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev + + - name: Build Core + run: npm run build:core:deploy + + - name: Run eslint (Web) + if: matrix.platform == 'web' + run: npm run lint + + - name: Build Frontend (Web) + if: matrix.platform == 'web' + run: npm run publish + + - name: Build Frontend (Tauri) + if: matrix.platform == 'tauri' + run: npm run tauri:build-html + + - name: Generate Icons (Tauri) + if: matrix.platform == 'tauri' + run: npm run tauri:icons + + - name: Cache screenshots (Web) + if: matrix.platform == 'web' + uses: actions/cache@v4 + with: + path: test/screenshots + key: ${{ runner.os }}-screenshots-${{ hashFiles('test/rendering-test.js') }} + restore-keys: ${{ runner.os }}-screenshots- + + - name: Run tests (Web) + if: matrix.platform == 'web' + run: | + echo "::add-matcher::.github/workflows/test-failures.json" + npm run test + + - name: Upload screenshots (Web) + if: matrix.platform == 'web' && (success() || failure()) + uses: actions/upload-artifact@v4 + with: + name: Screenshots + path: test/screenshots + + - name: Optimize + if: github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' + shell: bash + run: | + WASM_FILE=$(ls ${{ matrix.dist_path }}/*.wasm) + wasm-opt --all-features -O4 "$WASM_FILE" -o "$WASM_FILE" + + - name: Build (Tauri) + if: matrix.platform == 'tauri' + run: npm run tauri:publish + + - name: Add CNAME file (Web) + if: matrix.platform == 'web' && github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' + run: cp ./.github/workflows/CNAME ./${{ matrix.dist_path }}/CNAME + + - name: Deploy (Web) + if: matrix.platform == 'web' && github.repository == 'LiveSplit/LiveSplitOne' && github.ref == 'refs/heads/master' + uses: peaceiris/actions-gh-pages@v4 + with: + deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} + publish_branch: gh-pages + publish_dir: ./${{ matrix.dist_path }} + force_orphan: true diff --git a/livesplit-core b/livesplit-core index 922cc847..3c3762be 160000 --- a/livesplit-core +++ b/livesplit-core @@ -1 +1 @@ -Subproject commit 922cc8475499f9c8d48877ff437661cefebfefd5 +Subproject commit 3c3762bec27c1774e28384216281c7ed2d760250 diff --git a/package-lock.json b/package-lock.json index 2dac4c3a..fdd84c17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ }, "devDependencies": { "@pmmmwh/react-refresh-webpack-plugin": "^0.5.13", + "@tauri-apps/cli": "^1.6.0", "@types/node": "^20.12.7", "@types/selenium-webdriver": "^4.1.21", "@typescript-eslint/eslint-plugin": "^7.7.0", @@ -2897,6 +2898,194 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@tauri-apps/cli": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.6.0.tgz", + "integrity": "sha512-DBBpBl6GhTzm8ImMbKkfaZ4fDTykWrC7Q5OXP4XqD91recmDEn2LExuvuiiS3HYe7uP8Eb5B9NPHhqJb+Zo7qQ==", + "dev": true, + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "1.6.0", + "@tauri-apps/cli-darwin-x64": "1.6.0", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.6.0", + "@tauri-apps/cli-linux-arm64-gnu": "1.6.0", + "@tauri-apps/cli-linux-arm64-musl": "1.6.0", + "@tauri-apps/cli-linux-x64-gnu": "1.6.0", + "@tauri-apps/cli-linux-x64-musl": "1.6.0", + "@tauri-apps/cli-win32-arm64-msvc": "1.6.0", + "@tauri-apps/cli-win32-ia32-msvc": "1.6.0", + "@tauri-apps/cli-win32-x64-msvc": "1.6.0" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.6.0.tgz", + "integrity": "sha512-SNRwUD9nqGxY47mbY1CGTt/jqyQOU7Ps7Mx/mpgahL0FVUDiCEY/5L9QfEPPhEgccgcelEVn7i6aQHIkHyUtCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.6.0.tgz", + "integrity": "sha512-g2/uDR/eeH2arvuawA4WwaEOqv/7jDO/ZLNI3JlBjP5Pk8GGb3Kdy0ro1xQzF94mtk2mOnOXa4dMgAet4sUJ1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.6.0.tgz", + "integrity": "sha512-EVwf4oRkQyG8BpSrk0gqO7oA0sDM2MdNDtJpMfleYFEgCxLIOGZKNqaOW3M7U+0Y4qikmG3TtRK+ngc8Ymtrjg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.6.0.tgz", + "integrity": "sha512-YdpY17cAySrhK9dX4BUVEmhAxE2o+6skIEFg8iN/xrDwRxhaNPI9I80YXPatUTX54Kx55T5++25VJG9+3iw83A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.0.tgz", + "integrity": "sha512-4U628tuf2U8pMr4tIBJhEkrFwt+46dwhXrDlpdyWSZtnop5RJAVKHODm0KbWns4xGKfTW1F3r6sSv+2ZxLcISA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.6.0.tgz", + "integrity": "sha512-AKRzp76fVUaJyXj5KRJT9bJyhwZyUnRQU0RqIRqOtZCT5yr6qGP8rjtQ7YhCIzWrseBlOllc3Qvbgw3Yl0VQcA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.0.tgz", + "integrity": "sha512-0edIdq6aMBTaRMIXddHfyAFL361JqulLLd2Wi2aoOie7DkQ2MYh6gv3hA7NB9gqFwNIGE+xtJ4BkXIP2tSGPlg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.6.0.tgz", + "integrity": "sha512-QwWpWk4ubcwJ1rljsRAmINgB2AwkyzZhpYbalA+MmzyYMREcdXWGkyixWbRZgqc6fEWEBmq5UG73qz5eBJiIKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.6.0.tgz", + "integrity": "sha512-Vtw0yxO9+aEFuhuxQ57ALG43tjECopRimRuKGbtZYDCriB/ty5TrT3QWMdy0dxBkpDTu3Rqsz30sbDzw6tlP3Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.6.0.tgz", + "integrity": "sha512-h54FHOvGi7+LIfRchzgZYSCHB1HDlP599vWXQQJ/XnwJY+6Rwr2E5bOe/EhqoG8rbGkfK0xX3KPAvXPbUlmggg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@testim/chrome-version": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", diff --git a/package.json b/package.json index f0f724bf..15ee905c 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,11 @@ "publish": "webpack --mode production", "serve": "webpack serve", "start": "webpack serve --open", - "test": "mocha --exit test/**/*.js" + "test": "mocha --exit test/**/*.js", + "tauri:icons": "tauri icon src/assets/icon.png", + "tauri:build-html": "webpack --mode production --env TAURI=true", + "tauri:watch": "tauri dev", + "tauri:publish": "tauri build" }, "author": "", "license": "ISC", @@ -42,6 +46,7 @@ }, "devDependencies": { "@pmmmwh/react-refresh-webpack-plugin": "^0.5.13", + "@tauri-apps/cli": "^1.6.0", "@types/node": "^20.12.7", "@types/selenium-webdriver": "^4.1.21", "@typescript-eslint/eslint-plugin": "^7.7.0", diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 00000000..093810f3 --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,9 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas + +/icons diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 00000000..14e09ebf --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,4636 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[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 = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[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 = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[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 = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[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" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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 = "brotli" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" + +[[package]] +name = "bytemuck_derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "cargo_toml" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +dependencies = [ + "serde", + "toml 0.7.8", +] + +[[package]] +name = "cc" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c891175c3fb232128f48de6590095e59198bbeb8620c310be349bfc3afd12c7b" + +[[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.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[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.5", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[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.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cosmic-text" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75acbfb314aeb4f5210d379af45ed1ec2c98c7f1790bf57b8a4c562ac0c51b71" +dependencies = [ + "fontdb", + "hashbrown 0.14.5", + "libm", + "log", + "rangemap", + "rustc-hash", + "rustybuzz", + "self_cell", + "sys-locale", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +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-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +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.68", +] + +[[package]] +name = "ctor" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" +dependencies = [ + "quote", + "syn 2.0.68", +] + +[[package]] +name = "darling" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.68", +] + +[[package]] +name = "darling_macro" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.68", +] + +[[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.68", +] + +[[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-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "embed-resource" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6985554d0688b687c5cb73898a34fbe3ad6c24c58c238a4d91d5e840670ee9d" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.8.14", + "vswhom", + "winreg 0.52.0", +] + +[[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 = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "evdev" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab6055a93a963297befb0f4f6e18f314aec9767a4bbe88b151126df2433610a7" +dependencies = [ + "bitvec", + "cfg-if", + "libc", + "nix 0.23.2", + "thiserror", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +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 0.9.1", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", +] + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fontdb" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020e203f177c0fb250fb19455a252e838d2bbbce1f80f25ecc42402aafa8cd38" +dependencies = [ + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.19.2", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +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.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags 1.3.2", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.2.2", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps 6.2.2", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.2.2", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[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.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags 1.3.2", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.2.2", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "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 = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.11", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 1.0.11", + "pin-project-lite", + "socket2 0.4.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "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 = "ignore" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.7", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-traits", +] + +[[package]] +name = "image" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" +dependencies = [ + "bytemuck", + "byteorder", + "image-webp", + "num-traits", + "png", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d730b085583c4d789dfd07fdcf185be59501666a90c97c40162b37e4fdad272d" +dependencies = [ + "byteorder-lite", + "thiserror", +] + +[[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.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", + "serde", +] + +[[package]] +name = "infer" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[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 = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] + +[[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 = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[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 = "line-wrap" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd1bc4d24ad230d21fb898d1116b1801d7adfc449d42026475862ab48b11e70e" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "livesplit-core" +version = "0.13.0" +dependencies = [ + "base64-simd", + "bytemuck", + "bytemuck_derive", + "cfg-if", + "cosmic-text", + "hashbrown 0.14.5", + "image 0.25.1", + "itoa 1.0.11", + "libc", + "libm", + "livesplit-hotkey", + "livesplit-title-abbreviations", + "memchr", + "serde", + "serde_derive", + "serde_json", + "sha2", + "simdutf8", + "slab", + "smallstr", + "snafu", + "time", + "tiny-skia", + "windows-sys 0.52.0", +] + +[[package]] +name = "livesplit-hotkey" +version = "0.7.0" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "crossbeam-channel", + "evdev", + "mio", + "nix 0.28.0", + "promising-future", + "serde", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "livesplit-one" +version = "0.1.0" +dependencies = [ + "livesplit-core", + "serde", + "serde_derive", + "serde_json", + "tauri", + "tauri-build", +] + +[[package]] +name = "livesplit-title-abbreviations" +version = "0.3.0" + +[[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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[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 = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[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 = "memmap2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a5a03cefb0d953ec0be133036f14e109412fa594edc2f77227249db66cc3ed" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "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.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum", + "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.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +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 = "nix" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[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_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "outref" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags 1.3.2", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[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 0.5.2", + "smallvec", + "windows-targets 0.52.5", +] + +[[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.68", +] + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "plist" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9d34169e64b3c7a80c8621a48adaf44e0cf62c78a9b25dd9dd35f1881a17cf9" +dependencies = [ + "base64 0.21.7", + "indexmap 2.2.6", + "line-wrap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[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-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.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "promising-future" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44ba461c1b8785e502867026d893fa52801faccfbfe59efdae7da4b9094b4ce2" +dependencies = [ + "threadpool", +] + +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[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 = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "winreg 0.50.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "rustybuzz" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee8fe2a8461a0854a37101fe7a1b13998d0cfa987e43248e81d2a5f4570f6fa" +dependencies = [ + "bitflags 1.3.2", + "bytemuck", + "libm", + "smallvec", + "ttf-parser 0.20.0", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + +[[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 = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[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 = "self_cell" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" + +[[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.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "serde_json" +version = "1.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" +dependencies = [ + "indexmap 2.2.6", + "itoa 1.0.11", + "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.68", +] + +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +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.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.6", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[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 = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "git+https://github.com/CryZe/simdutf8?branch=wasm-ub-panic#6462aef317a3685c5d2749d3d8e7221a693da0b5" + +[[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 = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallstr" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b1aefdf380735ff8ded0b15f31aab05daf1f70216c01c02a12926badd1df9d" +dependencies = [ + "smallvec", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "snafu" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418b8136fec49956eba89be7da2847ec1909df92a9ae4178b5ff0ff092c8d95e" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a4812a669da00d17d8266a0439eddcacbc88b17f732f927e52eeb9d196f7fb5" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags 1.3.2", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags 1.3.2", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[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 = "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.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sys-locale" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0" +dependencies = [ + "libc", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr 0.15.8", + "heck 0.5.0", + "pkg-config", + "toml 0.8.14", + "version-compare 0.2.0", +] + +[[package]] +name = "tao" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575c856fc21e551074869dcfaad8f706412bd5b803dfa0fbf6881c4ff4bfafab" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkwayland-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image 0.24.9", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "tao-macros", + "unicode-segmentation", + "uuid", + "windows 0.39.0", + "windows-implement", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + +[[package]] +name = "tauri" +version = "1.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77567d2b3b74de4588d544147142d02297f3eaa171a25a065252141d8597a516" +dependencies = [ + "anyhow", + "bytes", + "cocoa", + "dirs-next", + "dunce", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "getrandom 0.2.15", + "glib", + "glob", + "gtk", + "heck 0.5.0", + "http", + "ignore", + "indexmap 1.9.3", + "objc", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "reqwest", + "semver", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab30cba12974d0f9b09794f61e72cad6da2142d3ceb81e519321bab86ce53312" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs-next", + "heck 0.5.0", + "json-patch", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a1d90db526a8cdfd54444ad3f34d8d4d58fa5c536463915942393743bd06f8" +dependencies = [ + "base64 0.21.7", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a582d75414250122e4a597b9dd7d3c910a2c77906648fc2ac9353845ff0feec" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7ffddf36d450791018e63a3ddf54979b9581d9644c584a5fb5611e6b5f20b4" +dependencies = [ + "gtk", + "http", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "uuid", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1989b3b4d611f5428b3414a4abae6fa6df30c7eb8ed33250ca90a5f7e5bb3655" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "450b17a7102e5d46d4bdabae0d1590fd27953e704e691fc081f06c06d2253b35" +dependencies = [ + "brotli", + "ctor", + "dunce", + "glob", + "heck 0.5.0", + "html5ever", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.2", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows-version", +] + +[[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 = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[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.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[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", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "libm", + "strict-num", +] + +[[package]] +name = "tinyvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +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.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2 0.5.7", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.14", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +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.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.13", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49d64318d8311fc2668e48b63969f4343e0a85c4a109aa8460d6672e364b8bd1" + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694" + +[[package]] +name = "unicode-ccc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" + +[[package]] +name = "unicode-script" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd" + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[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 = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[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.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.68", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "wasm-streams" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +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", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.2.2", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.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 = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[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.5", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[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.5", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + +[[package]] +name = "windows-tokens" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" + +[[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.5", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "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.24.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00711278ed357350d44c749c286786ecac644e044e4da410d466212152383b45" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http", + "kuchikiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[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 = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-jpeg" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +dependencies = [ + "zune-core", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 00000000..f2a2f678 --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "livesplit-one" +version = "0.1.0" +description = "A Tauri App" +authors = ["you"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1", features = [] } + +[dependencies] +tauri = { version = "1", features = [ "http-all"] } +serde = { version = "1" } +serde_derive = { version = "1" } +serde_json = "1" +livesplit-core = { path = "../livesplit-core" } + +[features] +# This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!! +custom-protocol = ["tauri/custom-protocol"] + +[profile.release] +lto = true +panic = "abort" +codegen-units = 1 +strip = true diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 00000000..d860e1e6 --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 00000000..c10b4488 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,225 @@ +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +use std::{ + borrow::Cow, + future::Future, + str::FromStr, + sync::{Arc, RwLock}, +}; + +use livesplit_core::{ + event::{CommandSink, Event, Result}, + hotkey::KeyCode, + networking::server_protocol::Command, + HotkeyConfig, HotkeySystem, TimeSpan, TimingMethod, +}; +use tauri::{Manager, Window}; + +struct State { + hotkey_system: RwLock>>, + window: RwLock>, +} + +#[tauri::command] +fn set_hotkey_config(state: tauri::State<'_, State>, config: HotkeyConfig) -> bool { + if let Some(hotkey_system) = &mut *state.hotkey_system.write().unwrap() { + hotkey_system.set_config(config).is_ok() + } else { + false + } +} + +#[tauri::command] +fn set_hotkey_activation(state: tauri::State<'_, State>, active: bool) -> bool { + if let Some(hotkey_system) = &mut *state.hotkey_system.write().unwrap() { + if active { + hotkey_system.activate() + } else { + hotkey_system.deactivate() + } + .is_ok() + } else { + false + } +} + +#[tauri::command] +fn get_hotkey_config(state: tauri::State<'_, State>) -> HotkeyConfig { + if let Some(hotkey_system) = &*state.hotkey_system.read().unwrap() { + hotkey_system.config() + } else { + HotkeyConfig::default() + } +} + +#[tauri::command] +fn resolve_hotkey(state: tauri::State<'_, State>, key_code: String) -> Cow<'static, str> { + if let Some(hotkey_system) = &*state.hotkey_system.read().unwrap() { + if let Ok(key_code) = KeyCode::from_str(&key_code) { + return hotkey_system.resolve(key_code); + } + } + key_code.into() +} + +#[derive(Clone)] +struct TauriCommandSink(Arc>>); + +impl TauriCommandSink { + fn send(&self, command: Command) { + self.0 + .read() + .unwrap() + .as_ref() + .unwrap() + .emit("command", command) + .unwrap(); + } +} + +impl CommandSink for TauriCommandSink { + fn start(&self) -> impl Future + 'static { + self.send(Command::Start); + async { Ok(Event::Unknown) } + } + + fn split(&self) -> impl Future + 'static { + self.send(Command::Split); + async { Ok(Event::Unknown) } + } + + fn split_or_start(&self) -> impl Future + 'static { + self.send(Command::SplitOrStart); + async { Ok(Event::Unknown) } + } + + fn reset(&self, save_attempt: Option) -> impl Future + 'static { + self.send(Command::Reset { save_attempt }); + async { Ok(Event::Unknown) } + } + + fn undo_split(&self) -> impl Future + 'static { + self.send(Command::UndoSplit); + async { Ok(Event::Unknown) } + } + + fn skip_split(&self) -> impl Future + 'static { + self.send(Command::SkipSplit); + async { Ok(Event::Unknown) } + } + + fn toggle_pause_or_start(&self) -> impl Future + 'static { + self.send(Command::TogglePauseOrStart); + async { Ok(Event::Unknown) } + } + + fn pause(&self) -> impl Future + 'static { + self.send(Command::Pause); + async { Ok(Event::Unknown) } + } + + fn resume(&self) -> impl Future + 'static { + self.send(Command::Resume); + async { Ok(Event::Unknown) } + } + + fn undo_all_pauses(&self) -> impl Future + 'static { + self.send(Command::UndoAllPauses); + async { Ok(Event::Unknown) } + } + + fn switch_to_previous_comparison(&self) -> impl Future + 'static { + self.send(Command::SwitchToPreviousComparison); + async { Ok(Event::Unknown) } + } + + fn switch_to_next_comparison(&self) -> impl Future + 'static { + self.send(Command::SwitchToNextComparison); + async { Ok(Event::Unknown) } + } + + fn set_current_comparison( + &self, + comparison: Cow<'_, str>, + ) -> impl Future + 'static { + self.send(Command::SetCurrentComparison { comparison }); + async { Ok(Event::Unknown) } + } + + fn toggle_timing_method(&self) -> impl Future + 'static { + self.send(Command::ToggleTimingMethod); + async { Ok(Event::Unknown) } + } + + fn set_current_timing_method( + &self, + method: TimingMethod, + ) -> impl Future + 'static { + self.send(Command::SetCurrentTimingMethod { + timing_method: method, + }); + async { Ok(Event::Unknown) } + } + + fn initialize_game_time(&self) -> impl Future + 'static { + self.send(Command::InitializeGameTime); + async { Ok(Event::Unknown) } + } + + fn set_game_time(&self, time: TimeSpan) -> impl Future + 'static { + self.send(Command::SetGameTime { time }); + async { Ok(Event::Unknown) } + } + + fn pause_game_time(&self) -> impl Future + 'static { + self.send(Command::PauseGameTime); + async { Ok(Event::Unknown) } + } + + fn resume_game_time(&self) -> impl Future + 'static { + self.send(Command::ResumeGameTime); + async { Ok(Event::Unknown) } + } + + fn set_loading_times(&self, time: TimeSpan) -> impl Future + 'static { + self.send(Command::SetLoadingTimes { time }); + async { Ok(Event::Unknown) } + } + + fn set_custom_variable( + &self, + key: Cow<'_, str>, + value: Cow<'_, str>, + ) -> impl Future + 'static { + self.send(Command::SetCustomVariable { key, value }); + async { Ok(Event::Unknown) } + } +} + +fn main() { + let sink = TauriCommandSink(Arc::new(RwLock::new(None))); + let hotkey_system = RwLock::new(HotkeySystem::new(sink.clone()).ok()); + tauri::Builder::default() + .manage(State { + hotkey_system, + window: RwLock::new(None), + }) + .setup(move |app| { + let main_window = app.windows().values().next().unwrap().clone(); + app.state::() + .window + .write() + .unwrap() + .replace(main_window.clone()); + *sink.0.write().unwrap() = Some(main_window); + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + set_hotkey_config, + set_hotkey_activation, + get_hotkey_config, + resolve_hotkey, + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 00000000..0660038b --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,43 @@ +{ + "build": { + "devPath": "target/dist", + "distDir": "target/dist", + "withGlobalTauri": true + }, + "package": { + "productName": "LiveSplit One", + "version": "0.1.0" + }, + "tauri": { + "allowlist": { + "all": false, + "http": { + "all": true, + "request": true, + "scope": ["https://www.speedrun.com/static/*"] + } + }, + "windows": [ + { + "title": "LiveSplit One", + "width": 850, + "height": 750 + } + ], + "security": { + "csp": null + }, + "bundle": { + "active": true, + "targets": "all", + "identifier": "org.livesplit.one", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } + } +} diff --git a/src/assets/icon.png b/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5191ca70fdd99c44d369a2ad52b500f241c18e19 GIT binary patch literal 108479 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 Nu5YSG(!KZU{{gELJP`l@ literal 0 HcmV?d00001 diff --git a/src/index.tsx b/src/index.tsx index 7ed3570a..80f6a779 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -18,7 +18,7 @@ if (typeof Symbol.asyncDispose !== "symbol") { }); } -if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { +if (process.env.NODE_ENV === "production" && window.__TAURI__ == null && "serviceWorker" in navigator) { navigator.serviceWorker.register("/service-worker.js"); } diff --git a/src/layout/Layout.tsx b/src/layout/Layout.tsx index fa6c3cb7..4562acbb 100644 --- a/src/layout/Layout.tsx +++ b/src/layout/Layout.tsx @@ -5,7 +5,7 @@ import { WebRenderer } from "../livesplit-core/livesplit_core"; import AutoRefresh from "../util/AutoRefresh"; import { UrlCache } from "../util/UrlCache"; import "../css/Layout.scss"; -import { GeneralSettings } from "../ui/SettingsEditor"; +import { GeneralSettings } from "../ui/MainSettings"; export interface Props { getState: () => LayoutStateRef, diff --git a/src/platform/CORS.ts b/src/platform/CORS.ts new file mode 100644 index 00000000..5d095cf2 --- /dev/null +++ b/src/platform/CORS.ts @@ -0,0 +1,15 @@ +export async function corsBustingFetch(url: string, signal?: AbortSignal): Promise { + if (window.__TAURI__ != null) { + const response = await window.__TAURI__.http.fetch( + url, + { responseType: 3 }, + ); + if (signal != null) { + signal.throwIfAborted(); + } + return new Uint8Array(response.data); + } else { + const response = await fetch(url, { signal }); + return response.arrayBuffer(); + } +} diff --git a/src/platform/Hotkeys.ts b/src/platform/Hotkeys.ts new file mode 100644 index 00000000..4953d1f3 --- /dev/null +++ b/src/platform/Hotkeys.ts @@ -0,0 +1,85 @@ +import { CommandSinkRef, HotkeyConfig, HotkeySystem } from "../livesplit-core"; +import { expect } from "../util/OptionUtil"; + +export interface HotkeyImplementation { + config(): Promise | HotkeyConfig, + setConfig(config: HotkeyConfig): void, + activate(): void, + deactivate(): void, + resolve(keyCode: string): Promise | string, +} + +class GlobalHotkeys implements HotkeyImplementation { + constructor(private hotkeySystem?: HotkeySystem) { } + + public async config(): Promise { + return expect(HotkeyConfig.parseJson( + await window.__TAURI__!.tauri.invoke("get_hotkey_config"), + ), "Couldn't parse the hotkey config."); + } + + public setConfig(config: HotkeyConfig): void { + window.__TAURI__!.tauri.invoke("set_hotkey_config", { config: config.asJson() }); + if (this.hotkeySystem != null) { + this.hotkeySystem.setConfig(config); + } else { + config[Symbol.dispose](); + } + } + + setConfigJson(configJson: unknown): void { + window.__TAURI__!.tauri.invoke("set_hotkey_config", { config: configJson }); + if (this.hotkeySystem != null) { + const config = HotkeyConfig.parseJson(configJson); + if (config != null) { + this.hotkeySystem.setConfig(config); + } + } + } + + public activate(): void { + window.__TAURI__!.tauri.invoke("set_hotkey_activation", { active: true }); + this.hotkeySystem?.activate(); + } + + public deactivate(): void { + window.__TAURI__!.tauri.invoke("set_hotkey_activation", { active: false }); + this.hotkeySystem?.deactivate(); + } + + public resolve(keyCode: string): Promise { + return window.__TAURI__!.tauri.invoke("resolve_hotkey", { keyCode }); + } +} + +export function createHotkeys(commandSink: CommandSinkRef, configJson: unknown): HotkeyImplementation { + let hotkeySystem: HotkeySystem | null = null; + + const tauri = window.__TAURI__ != null; + + if (!tauri || navigator.platform === "Win32") { + try { + const config = HotkeyConfig.parseJson(configJson); + if (config !== null) { + hotkeySystem = HotkeySystem.withConfig(commandSink, config); + } + } catch (_) { /* Looks like the storage has no valid data */ } + + if (hotkeySystem == null) { + hotkeySystem = expect( + HotkeySystem.new(commandSink), + "Couldn't initialize the hotkeys", + ); + } + } + + if (tauri) { + const globalHotkeys = new GlobalHotkeys(hotkeySystem ?? undefined); + if (configJson != null) { + globalHotkeys.setConfigJson(configJson); + } + return globalHotkeys; + } else { + return hotkeySystem!; + } +} diff --git a/src/storage/index.tsx b/src/storage/index.tsx index 14bddca8..21181a52 100644 --- a/src/storage/index.tsx +++ b/src/storage/index.tsx @@ -1,7 +1,7 @@ import { openDB, IDBPDatabase } from "idb"; import { Option, assert } from "../util/OptionUtil"; import { RunRef, Run, TimingMethod } from "../livesplit-core"; -import { GeneralSettings } from "../ui/SettingsEditor"; +import { GeneralSettings } from "../ui/MainSettings"; import { FRAME_RATE_AUTOMATIC } from "../util/FrameRate"; export type HotkeyConfigSettings = unknown; @@ -247,9 +247,11 @@ export async function loadGeneralSettings(): Promise { const generalSettings = await db.get("settings", "generalSettings") ?? {}; + const isTauri = window.__TAURI__ != null; + return { frameRate: generalSettings.frameRate ?? FRAME_RATE_AUTOMATIC, - showControlButtons: generalSettings.showControlButtons ?? true, + showControlButtons: generalSettings.showControlButtons ?? !isTauri, showManualGameTime: generalSettings.showManualGameTime ?? false, saveOnReset: generalSettings.saveOnReset ?? false, speedrunComIntegration: generalSettings.speedrunComIntegration ?? true, diff --git a/src/type-definitions/tauri.d.ts b/src/type-definitions/tauri.d.ts new file mode 100644 index 00000000..86d668fe --- /dev/null +++ b/src/type-definitions/tauri.d.ts @@ -0,0 +1,46 @@ +declare var __TAURI__: GlobalTauri | undefined; + +declare interface GlobalTauri { + tauri: TauriModule; + event: TauriEventModule; + notification: TauriNotificationModule; + http: TauriHttpModule; +} + +declare interface TauriModule { + invoke(cmd: string, args?: Record): Promise; +} + +declare interface TauriEventModule { + listen(eventName: string, callback: (event: TauriEvent) => void): Promise; +} + +declare interface TauriNotificationModule { + isPermissionGranted(): Promise; + requestPermission(): Promise; + sendNotification(notification: TauriNotification): void; +} + +declare interface TauriNotification { + title: string; + body: string; +} + +declare interface TauriHttpModule { + fetch(url: string, options: { responseType: 3 }): Promise>>; +} + +declare interface TauriResponse { + data: T, +} + +declare interface TauriHttpOptions { + responseType: number; +} + +declare interface TauriEvent { + event: string; + payload: unknown; +} + +declare interface ListenHandle { } diff --git a/src/ui/HotkeyButton.tsx b/src/ui/HotkeyButton.tsx index f8dc1cf4..70519266 100644 --- a/src/ui/HotkeyButton.tsx +++ b/src/ui/HotkeyButton.tsx @@ -4,7 +4,7 @@ import { hotkeySystem } from "./LiveSplit"; import "../css/HotkeyButton.scss"; -function resolveKey(keyCode: string): string { +function resolveKey(keyCode: string): Promise | string { return expect(hotkeySystem, "The Hotkey System should always be initialized.").resolve(keyCode); } @@ -16,6 +16,7 @@ export interface Props { export interface State { listener: Option, intervalHandle: Option, + resolvedKey: Option, } export default class HotkeyButton extends React.Component { @@ -25,19 +26,34 @@ export default class HotkeyButton extends React.Component { this.state = { listener: null, intervalHandle: null, + resolvedKey: null, }; + + this.updateResolvedKey(props.value); + } + public componentDidUpdate(previousProps: Props) { + if (previousProps.value !== this.props.value) { + this.updateResolvedKey(this.props.value); + } } - public render() { - const value = this.props.value; - let buttonText = null; + private async updateResolvedKey(value: Option): Promise { + let resolvedKey = ""; if (value != null) { const matches = value.match(/(.+)\+\s*(.+)$/); if (matches != null) { - buttonText = `${matches[1]}+ ${resolveKey(matches[2])}`; + resolvedKey = `${matches[1]}+ ${await resolveKey(matches[2])}`; } else { - buttonText = resolveKey(value); + resolvedKey = await resolveKey(value); } + } + this.setState({ resolvedKey }); + } + + public render() { + let buttonText: Option | JSX.Element = null; + if (this.props.value != null) { + buttonText = this.state.resolvedKey; } else if (this.state.listener != null) { buttonText =