diff --git a/.github/workflows/cooker-selfhosted.yml b/.github/workflows/cooker-selfhosted.yml
index 43d086c9..4ffb693a 100644
--- a/.github/workflows/cooker-selfhosted.yml
+++ b/.github/workflows/cooker-selfhosted.yml
@@ -1,32 +1,31 @@
name: "Build cooker"
on:
- # push:
- # branches:
- # - cooker*
- # - feat*
- # paths:
- # - '.github/workflows/**'
- # - 'automation_tools/**'
- # - 'emu-configs/**'
- # - 'es-configs/**'
- # - 'functions/**'
- # - 'rd-submodules/**'
- # - '*.sh'
- # - 'net.retrodeck.retrodeck.yml'
- # - 'net.retrodeck.retrodeck.appdata.xml'
- # pull_request:
- # branches:
- # - cooker*
+ push:
+ branches:
+ - cooker*
+ - feat*
+ paths:
+ - '.github/workflows/**'
+ - 'automation_tools/**'
+ - 'emu-configs/**'
+ - 'es-configs/**'
+ - 'functions/**'
+ - 'rd-submodules/**'
+ - '*.sh'
+ - 'net.retrodeck.retrodeck.yml'
+ - 'net.retrodeck.retrodeck.appdata.xml'
+ pull_request:
+ branches:
+ - cooker*
# Italy (CET): 11:00 PM
# Japan (JST): 7:00 AM
- schedule:
- - cron: '0 22 * * *'
+ # schedule:
+ # - cron: '0 22 * * *'
workflow_dispatch:
-
jobs:
Building_RetroDECK:
@@ -49,6 +48,33 @@ jobs:
- name: Generate cooker build ID
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh"
+ - name: Get branch name
+ id: branch_name
+ run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV
+
+ # if it's a feature branch it will not marked as "latest" cooker version
+ - name: "Set makeLatest (cooker only)"
+ run: |
+ if [[ "$BRANCH_NAME" == 'feat/'* || "$BRANCH_NAME" == 'refs/'* ]]; then
+ echo "MAKE_LATEST=false" >> $GITHUB_ENV
+ else
+ echo "MAKE_LATEST=true" >> $GITHUB_ENV
+ fi
+
+ # if the branch is coming from a PR the tag should be manually built
+ - name: "Generate version tag"
+ run: |
+ if [[ "$BRANCH_NAME" == 'refs/'* ]]; then
+ pr_number=$(echo ${{env.BRANCH_NAME}} | awk -F'/' '{print $3}')
+ source_branch=$(curl -s "https://api.github.com/repos/XargonWan/RetroDECK/pulls/$pr_number" | jq -r '.head.ref')
+ source_branch=${source_branch//\//-}
+ echo "[DEBUG] source branch is: $source_branch"
+ echo "TAG=PR-$pr_number-$source_branch-${{ env.buildid }}" >> $GITHUB_ENV
+ else
+ echo "TAG=${{env.BRANCH_NAME}}-${{ env.buildid }}" >> $GITHUB_ENV
+ fi
+ echo "Version TAG: ${{ env.TAG }}"
+
# backing up manifest in case download fails and hashes must be recalculated
- name: Manifest backup
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
@@ -109,23 +135,10 @@ jobs:
id: commits
continue-on-error: true
- - name: Get branch name
- id: branch_name
- run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV
-
- # if it's a feature branch it will not marked as "latest" cooker version
- - name: "Set makeLatest (cooker only)"
- run: |
- if [[ "$BRANCH_NAME" == 'feat/'* ]]; then
- echo "MAKE_LATEST=false" >> $GITHUB_ENV
- else
- echo "MAKE_LATEST=true" >> $GITHUB_ENV
- fi
-
- name: Publish the flatpak in a new cooker release
uses: ncipollo/release-action@v1
with:
- tag: "${{env.BRANCH_NAME}}-${{ env.buildid }}"
+ tag: "${{env.TAG}}"
body: |
# Release Notes (Cooker)
This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
@@ -134,12 +147,12 @@ jobs:
## Commits since last release
${{ steps.commits.outputs.commits }}
- For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/qQcrFvaA2C) on our Discord server.
+ For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server.
Cooker channel is provided for the community to test fixes and explore new functionality.
Please DO NOT open issues or ask support on this build.
- artifacts: "RetroDECK-cooker.flatpak,RetroDECK-Artifact.tar.gz"
+ artifacts: "RetroDECK-cooker.flatpak,RetroDECK-cooker.flatpak.sha,RetroDECK-Artifact.tar.gz"
allowUpdates: true
makeLatest: ${{env.MAKE_LATEST}} # if it's a feat branch is not considered the latest build
token: ${{ secrets.TRIGGER_BUILD_TOKEN }}
@@ -154,3 +167,53 @@ jobs:
path: RetroDECK-cooker.flatpak
continue-on-error: true
+ # - name: Upload RetroDECK-cooker.flatpak to Gitea Release
+ # run: |
+ # # Set variables for Gitea host, organization, repository, access token, and release details
+ # GITEA_HOST="repo.retrodeck.net"
+ # ORGANIZATION="RetroDECK"
+ # REPO="RetroDECK-cooker"
+ # GITEA_TOKEN="${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}"
+ # RELEASE_NAME="RetroDECK ${{env.TAG}}"
+ # TAG="${{env.TAG}}"
+ # RELEASE_BODY="# Release Notes (Cooker)
+ # This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
+ # On branch [${{env.BRANCH_NAME}}](https://repo.retrodeck.net/RetroDECK/RetroDECK/src/branch/${{env.BRANCH_NAME}}).
+
+ # ## Commits since last release
+ # ${{ steps.commits.outputs.commits }}
+
+ # For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server.
+
+ # Cooker channel is provided for the community to test fixes and explore new functionality.
+ # Please DO NOT open issues or ask support on this build."
+
+ # # Create a release using curl and capture the release ID
+ # release_response=$(curl -X POST \
+ # -H "Authorization: token ${GITEA_TOKEN}" \
+ # -H "Content-Type: application/json" \
+ # -d "{\"tag_name\":\"$TAG\",\"name\":\"$RELEASE_NAME\",\"body\":\"$RELEASE_BODY\"}" \
+ # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases")
+
+ # # Extract the release ID from the response
+ # release_id=$(echo $release_response | jq -r '.id')
+
+ # # Upload artifacts
+ # curl -X POST \
+ # -H "Authorization: token ${GITEA_TOKEN}" \
+ # -H "Content-Type: multipart/form-data" \
+ # -F "attachment=@RetroDECK-cooker.flatpak" \
+ # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak"
+
+ # # Upload artifacts sha
+ # curl -X POST \
+ # -H "Authorization: token ${GITEA_TOKEN}" \
+ # -H "Content-Type: multipart/form-data" \
+ # -F "attachment=@RetroDECK-cooker.flatpak.sha" \
+ # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak.sha"
+
+ # curl -X POST \
+ # -H "Authorization: token ${GITEA_TOKEN}" \
+ # -H "Content-Type: multipart/form-data" \
+ # -F "attachment=@RetroDECK-Artifact.tar.gz" \
+ # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-Artifact.tar.gz"
diff --git a/.github/workflows/main-selfhosted.yml b/.github/workflows/main-selfhosted.yml
index 2618d7ba..567aec26 100644
--- a/.github/workflows/main-selfhosted.yml
+++ b/.github/workflows/main-selfhosted.yml
@@ -108,7 +108,7 @@ jobs:
tag: ${{ env.REL_VER }}
name: "RetroDECK v${{ env.REL_VER }}"
bodyFile: "body.md"
- artifacts: "RetroDECK.flatpak,RetroDECK-Artifact.tar.gz"
+ artifacts: "RetroDECK.flatpak,RetroDECK.flatpak.sha,RetroDECK-Artifact.tar.gz"
allowUpdates: true
makeLatest: true
token: ${{ secrets.TRIGGER_BUILD_TOKEN }}
@@ -122,3 +122,36 @@ jobs:
name: retrodeck-flatpak
path: RetroDECK.flatpak
continue-on-error: true
+
+ - name: Publish the flatpak in a new release on Gitea
+ uses: ncipollo/release-action@v1
+ env:
+ REL_VER: ${{ env.REL_VER }}
+ with:
+ tag: ${{ env.REL_VER }}
+ name: "RetroDECK v${{ env.REL_VER }}"
+ bodyFile: "body.md"
+ artifacts: "RetroDECK.flatpak,RetroDECK-Artifact.tar.gz"
+ allowUpdates: true
+ makeLatest: true
+ token: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}
+ repo: "https://repo.retrodeck.net/RetroDECK/RetroDECK"
+ continue-on-error: true
+
+ - name: Upload RetroDECK.flatpak to Gitea Release
+ run: |
+ curl -X POST \
+ -H "Authorization: token ${GITEA_TOKEN}" \
+ -F "file=@RetroDECK.flatpak" \
+ "https://repo.retrodeck.net/RetroDECK/RetroDECK/releases/${{ env.REL_VER }}/assets?name=RetroDECK.flatpak"
+ env:
+ GITEA_TOKEN: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}
+
+ - name: Upload RetroDECK.flatpak.sha to Gitea Release
+ run: |
+ curl -X POST \
+ -H "Authorization: token ${GITEA_TOKEN}" \
+ -F "file=@RetroDECK.flatpak.sha" \
+ "https://repo.retrodeck.net/RetroDECK/RetroDECK/releases/${{ env.REL_VER }}/assets?name=RetroDECK.flatpak.sha"
+ env:
+ GITEA_TOKEN: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}
diff --git a/.github/workflows/removed/remove-artifacts.yml b/.github/workflows/remove-artifacts.yml
similarity index 100%
rename from .github/workflows/removed/remove-artifacts.yml
rename to .github/workflows/remove-artifacts.yml
diff --git a/.gitignore b/.gitignore
index d2569309..05fda91c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,6 +21,7 @@ rd-submodules/es-de/patches-tmp*
.local/
buildid
*.bak
+incconfigs/
# Python #
##########
diff --git a/README.md b/README.md
index 88b3f7cb..d260662c 100644
--- a/README.md
+++ b/README.md
@@ -46,15 +46,15 @@ For more information read up here:
RetroDECK is a [EmulationStation Desktop Edition](https://es-de.org) (ES-DE) powered Linux [Flatpak application](https://flathub.org/apps/net.retrodeck.retrodeck) that thanks to its `RetroDECK Framework` it builds-in and manage a variety of emulators and other software that allows you to play your favorite retro (and even not-so-retro) games in one complete package.
### So what does that mean?
-It means that RetroDECK provides all the emulators, systems and a frontend. RetroDECK configures them for you and put them into one application you can download from Flathub.
+It means that RetroDECK provides all the emulators, systems and a frontend. RetroDECK configures them for you and puts them into one application you can download from Flathub.
By being one application RetroDECK can put all important files in one location for all the emulators, instead of having them spread out over your entire system and even add features on top to orchestrate them seamlessly.
### The RetroDECK Framework
-As previously mentioned, RetroDECK also adds the `RetroDECK Framework` on top of the emulators and ES-DE interface that allows deeper integrations between emulators and easier exposure to a variety of features that you otherwise need to set per emulator basis to create a uniformity between them.
+As previously mentioned, RetroDECK also adds the `RetroDECK Framework` on top of the emulators and ES-DE interface which allows deeper integrations between emulators and easier exposure to a variety of features that you otherwise need to set on a per emulator basis to create a uniformity between them.
-The `RetroDECK Configurator` is a `Utility` that some parts of exposes the `RetroDECK Framework` to the RetroDECK users.
+The `RetroDECK Configurator` is a `Utility` that exposes some parts of the `RetroDECK Framework` to the RetroDECK users.
**What can the RetroDECK Framework and by extent the RetroDECK Configurator do?**
@@ -67,18 +67,18 @@ It can help with:
- Auto installing some free BIOSes
- Install prebuilt Steam Input profiles for devices like the Steam Deck and external controllers
- Easier management of `mods`, `roms`, `texture_packs`, `scraped media`, `screenshots`, `saves / states` `gamelists` and more
-- Give access to global presets that can be acitivated to configure things over many emulators in one go like: `RetroAchievements`
+- Give access to global presets that can be activated to configure things over many emulators in one go like: `RetroAchievements`
`Borders` `Widescreen Mode` `Swaping A/B X/Y for Nintendo Games`
For our long term vision you can check out the following wiki page:
[RetroDECK: Visions and Goals](https://retrodeck.readthedocs.io/en/latest/wiki_about/visions-and-goals/)
### How to get support?
-Use the supports channels on [Discord](https://discord.gg/Dz3szYsP8g) `🤝-community-support` and `🆘-support`.
+Use the supports channels on [Discord](https://discord.gg/WDc5C9YWMx) `🤝-community-support` and `🆘-support`.
### The RetroDECK community:
[Website](https://retrodeck.net)
[Wiki](https://github.com/XargonWan/RetroDECK/wiki)
-[Discord](https://discord.gg/Dz3szYsP8g)
+[Discord](https://discord.gg/WDc5C9YWMx)
[Lemmy](https://lemmy.zip/c/retrodeck)
[Subreddit](https://www.reddit.com/r/retrodeck)
@@ -99,6 +99,7 @@ Read up here on how to help out, there is something for everyone:
| [RetroDECK](https://github.com/XargonWan/RetroDECK) | This one, our main repo where the core of the project is |
| [RetroDECK-cooker](https://github.com/XargonWan/RetroDECK-cooker) | Where we publish our test build, no code is hosted here |
| [RetroDECK-Wiki](https://github.com/XargonWan/RetroDECK-Wiki) | Where our wiki source code is |
+| [RetroDECK-website](https://github.com/XargonWan/RetroDECK-website) | Where our website source code is |
| [RetroDECK on Flathub](https://github.com/flathub/net.retrodeck.retrodeck) | Our little space in Flathub's organization |
| [RetroDECK-MAME](https://github.com/XargonWan/RetroDECK-MAME) | MAME is big to build, so it's pre-built here and then imported in the build |
| [RetroDECK-ES-DE](https://github.com/XargonWan/RetroDECK-ES-DE) | This is where we store our patched fork of ES-DE |
@@ -109,7 +110,7 @@ Read up here on how to help out, there is something for everyone:
Please check out the [Wiki](https://github.com/XargonWan/RetroDECK/wiki) for even more information.
## The FAQ
-The RetroDECK [FAQ](https://github.com/XargonWan/RetroDECK/wiki/FAQs%3A-Frequently-asked-questions) on the wiki has a vast variety of questions and awnsers.
+The RetroDECK [FAQ](https://github.com/XargonWan/RetroDECK/wiki/FAQs%3A-Frequently-asked-questions) on the wiki has a vast variety of questions and answers.
# How to get support?
-Use the supports channels on [Discord](https://discord.gg/Dz3szYsP8g).
+Use the supports channels on [Discord](https://discord.gg/WDc5C9YWMx).
diff --git a/automation_tools/appdata_management.sh b/automation_tools/appdata_management.sh
index f6cdfb19..9eb2ba4e 100755
--- a/automation_tools/appdata_management.sh
+++ b/automation_tools/appdata_management.sh
@@ -7,24 +7,24 @@ source automation_tools/version_extractor.sh
# Fetch appdata version
appdata_version=$(fetch_appdata_version)
-echo -e "Appdata:\t\t$appdata_version"
+log i "Appdata:\t\t$appdata_version"
# Defining manifest file location
appdata_file="net.retrodeck.retrodeck.appdata.xml"
# Check if release with appdata_version already exists
if grep -q "version=\"$appdata_version\"" "$appdata_file"; then
- echo "Deleting existing release version $appdata_version..."
+ log i "Deleting existing release version $appdata_version..."
# Remove the existing release entry
sed -i "//d" "$appdata_file"
fi
-echo "Adding new release version $appdata_version..."
+log i "Adding new release version $appdata_version..."
# Get today's date in the required format (YYYY-MM-DD)
today_date=$(date +"%Y-%m-%d")
-echo "Today is $today_date"
+log i "Today is $today_date"
# Construct the release snippet
release_snippet="\
diff --git a/automation_tools/cooker_build_id.sh b/automation_tools/cooker_build_id.sh
old mode 100644
new mode 100755
diff --git a/automation_tools/flatpak_build_bundle.sh b/automation_tools/flatpak_build_bundle.sh
index 3568ebb7..8e79186f 100755
--- a/automation_tools/flatpak_build_bundle.sh
+++ b/automation_tools/flatpak_build_bundle.sh
@@ -4,6 +4,8 @@
if [ "${GITHUB_REF##*/}" = "main" ]; then
flatpak build-bundle "${GITHUB_WORKSPACE}/.local" "$GITHUB_WORKSPACE/RetroDECK.flatpak" net.retrodeck.retrodeck
+ sha256sum RetroDECK.flatpak > RetroDECK.flatpak.sha
else
flatpak build-bundle "${GITHUB_WORKSPACE}/.local" "$GITHUB_WORKSPACE/RetroDECK-cooker.flatpak" net.retrodeck.retrodeck
+ sha256sum RetroDECK-cooker.flatpak > RetroDECK-cooker.flatpak.sha
fi
\ No newline at end of file
diff --git a/automation_tools/install_dependencies.sh b/automation_tools/install_dependencies.sh
index 91503927..3daa4edb 100755
--- a/automation_tools/install_dependencies.sh
+++ b/automation_tools/install_dependencies.sh
@@ -1,6 +1,31 @@
#!/bin/bash
-# This scritp is installing the required dependencies to correctly run the pipeline and buold the flatpak
+# This script is installing the required dependencies to correctly run the pipeline and build the flatpak
+
+unset pkg_mgr
+
+# rpm-ostree must be checked before dnf because a dnf (wrapper) command also works on rpm-ostree distros (not what we want)
+for potential_pkg_mgr in apt pacman rpm-ostree dnf; do
+ command -v "$potential_pkg_mgr" &> /dev/null && pkg_mgr="$potential_pkg_mgr" && break
+done
+
+case "$pkg_mgr" in
+ apt)
+ sudo apt install -y flatpak flatpak-builder p7zip-full xmlstarlet bzip2 curl jq
+ ;;
+ pacman)
+ sudo pacman -S --noconfirm flatpak flatpak-builder p7zip xmlstarlet bzip2
+ ;;
+ rpm-ostree)
+ echo "When using a distro with rpm-ostree, you shouldn't build directly on the host. Try using a distrobox."
+ exit 1
+ ;;
+ dnf)
+ sudo dnf install -y flatpak flatpak-builder p7zip p7zip-plugins xmlstarlet bzip2 curl
+ ;;
+ *)
+ echo "Package manager $pkg_mgr not supported. Please open an issue."
+ ;;
+esac
-sudo apt install -y flatpak flatpak-builder p7zip-full xmlstarlet bzip2 curl jq
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
-flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo
\ No newline at end of file
+flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo
diff --git a/build-locally.sh b/developer_toolbox/build_retrodeck_locally.sh
similarity index 86%
rename from build-locally.sh
rename to developer_toolbox/build_retrodeck_locally.sh
index 373d5b10..85b9e90e 100755
--- a/build-locally.sh
+++ b/developer_toolbox/build_retrodeck_locally.sh
@@ -1,7 +1,8 @@
#!/bin/bash
-# TODO: FEDORA
-# sudo dnf install -y flatpak flatpak-builder p7zip p7zip-plugins xmlstarlet bzip2 curl
+# WARNING: run this script from the project root folder, not from here!!
+
+git submodule update --init --recursive
export GITHUB_WORKSPACE="."
cp net.retrodeck.retrodeck.appdata.xml net.retrodeck.retrodeck.appdata.xml.bak
diff --git a/developer_toolbox/inject_framework.sh b/developer_toolbox/inject_framework.sh
new file mode 100755
index 00000000..65a16c35
--- /dev/null
+++ b/developer_toolbox/inject_framework.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# WARNING: run this script from the project root folder, not from here!!
+
+# This script is used to inject framework and config files inside a RetroDECK cooker installation
+# To apply the injected config you have to reset the targeted component from the Configurator
+# Please know what you're doing, if you need to undo this you need to completely uninstall and reinstall RetroDECK flatpak
+# Please not that this may create a dirty situation where older files are still in place as the action is add and overwrite
+
+flatpak_user_installation="$HOME/.local/share/flatpak/app/net.retrodeck.retrodeck/current/active/files"
+flatpak_system_installation="/var/lib/flatpak/app/net.retrodeck.retrodeck/current/active/files"
+
+if [ -d "$flatpak_user_installation" ]; then
+ echo "RetroDECK is installed in user mode, proceeding."
+ app="$flatpak_user_installation"
+elif [ -d "$flatpak_system_installation" ]; then
+ echo "RetroDECK is installed in system mode, proceeding."
+ app="$flatpak_system_installation"
+else
+ echo "RetroDECK installation not found, quitting"
+ exit 1
+fi
+
+sudo cp -vfr "res/binding_icons" "$app/retrodeck/binding_icons"
+sudo cp -vfr "emu-configs/"** "$app/retrodeck/emu-configs/"
+sudo cp -vfr "tools" "$app"
+sudo cp -vfr "retrodeck.sh" "$app/bin/"
+sudo cp -vfr "functions/"** "$app/libexec/"
diff --git a/docs/.nojekyll b/docs/.nojekyll
deleted file mode 100644
index 8b137891..00000000
--- a/docs/.nojekyll
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/docs/.well-known/org.flathub.VerifiedApps.txt b/docs/.well-known/org.flathub.VerifiedApps.txt
deleted file mode 100644
index 0eb41220..00000000
--- a/docs/.well-known/org.flathub.VerifiedApps.txt
+++ /dev/null
@@ -1 +0,0 @@
-b98237ec-72ae-4779-bc52-2802057a83ff
\ No newline at end of file
diff --git a/docs/CNAME b/docs/CNAME
deleted file mode 100644
index 4e46fbf8..00000000
--- a/docs/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-retrodeck.net
\ No newline at end of file
diff --git a/docs/assets/bootstrap/css/bootstrap.min.css b/docs/assets/bootstrap/css/bootstrap.min.css
deleted file mode 100644
index eedff215..00000000
--- a/docs/assets/bootstrap/css/bootstrap.min.css
+++ /dev/null
@@ -1,12 +0,0 @@
-@charset "UTF-8";/*!
- * Bootswatch v5.2.0 (https://bootswatch.com)
- * Theme: lux
- * Copyright 2012-2022 Thomas Park
- * Licensed under MIT
- * Based on Bootstrap
-*//*!
- * Bootstrap v5.2.0 (https://getbootstrap.com/)
- * Copyright 2011-2022 The Bootstrap Authors
- * Copyright 2011-2022 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */@import url(https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@400;600&display=swap);:root{--bs-blue:#007bff;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#d9534f;--bs-orange:#fd7e14;--bs-yellow:#f0ad4e;--bs-green:#4bbf73;--bs-teal:#20c997;--bs-cyan:#1f9bcf;--bs-black:#000;--bs-white:#fff;--bs-gray:#919aa1;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#f7f7f9;--bs-gray-300:#eceeef;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#919aa1;--bs-gray-700:#55595c;--bs-gray-800:#343a40;--bs-gray-900:#1a1a1a;--bs-primary:#1a1a1a;--bs-secondary:#fff;--bs-success:#4bbf73;--bs-info:#1f9bcf;--bs-warning:#f0ad4e;--bs-danger:#d9534f;--bs-light:#fff;--bs-dark:#343a40;--bs-primary-rgb:26,26,26;--bs-secondary-rgb:255,255,255;--bs-success-rgb:75,191,115;--bs-info-rgb:31,155,207;--bs-warning-rgb:240,173,78;--bs-danger-rgb:217,83,79;--bs-light-rgb:255,255,255;--bs-dark-rgb:52,58,64;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:85,89,92;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:"Nunito Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#55595c;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#eceeef;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#1a1a1a;--bs-link-hover-color:#151515;--bs-code-color:#e83e8c;--bs-highlight-bg:#fcefdc}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:600;line-height:1.2;color:#1a1a1a}.h1,h1{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h1,h1{font-size:2rem}}.h2,h2{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h2,h2{font-size:1.75rem}}.h3,h3{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h3,h3{font-size:1.5rem}}.h4,h4{font-size:1.25rem}.h5,h5{font-size:1rem}.h6,h6{font-size:.75rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color)}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#919aa1;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#919aa1}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid var(--bs-border-color);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#919aa1}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:rgba(0, 0, 0, 0.05);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--bs-table-color);vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#d1d1d1;--bs-table-border-color:#bcbcbc;--bs-table-striped-bg:#c7c7c7;--bs-table-striped-color:#000;--bs-table-active-bg:#bcbcbc;--bs-table-active-color:#000;--bs-table-hover-bg:#c1c1c1;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:white;--bs-table-border-color:#e6e6e6;--bs-table-striped-bg:#f2f2f2;--bs-table-striped-color:#000;--bs-table-active-bg:#e6e6e6;--bs-table-active-color:#000;--bs-table-hover-bg:#ececec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#dbf2e3;--bs-table-border-color:#c5dacc;--bs-table-striped-bg:#d0e6d8;--bs-table-striped-color:#000;--bs-table-active-bg:#c5dacc;--bs-table-active-color:#000;--bs-table-hover-bg:#cbe0d2;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#d2ebf5;--bs-table-border-color:#bdd4dd;--bs-table-striped-bg:#c8dfe9;--bs-table-striped-color:#000;--bs-table-active-bg:#bdd4dd;--bs-table-active-color:#000;--bs-table-hover-bg:#c2d9e3;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fcefdc;--bs-table-border-color:#e3d7c6;--bs-table-striped-bg:#efe3d1;--bs-table-striped-color:#000;--bs-table-active-bg:#e3d7c6;--bs-table-active-color:#000;--bs-table-hover-bg:#e9ddcc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f7dddc;--bs-table-border-color:#dec7c6;--bs-table-striped-bg:#ebd2d1;--bs-table-striped-color:#000;--bs-table-active-bg:#dec7c6;--bs-table-active-color:#000;--bs-table-hover-bg:#e4cccc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#fff;--bs-table-border-color:#e6e6e6;--bs-table-striped-bg:#f2f2f2;--bs-table-striped-color:#000;--bs-table-active-bg:#e6e6e6;--bs-table-active-color:#000;--bs-table-hover-bg:#ececec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#343a40;--bs-table-border-color:#484e53;--bs-table-striped-bg:#3e444a;--bs-table-striped-color:#fff;--bs-table-active-bg:#484e53;--bs-table-active-color:#fff;--bs-table-hover-bg:#43494e;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:.75rem;padding-bottom:.75rem;margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:2rem;padding-bottom:2rem;font-size:1.25rem}.col-form-label-sm{padding-top:.5rem;padding-bottom:.5rem;font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#919aa1}.form-control{display:block;width:100%;padding:.75rem 1.5rem;font-size:1rem;font-weight:400;line-height:1.5;color:#55595c;background-color:#f7f7f9;background-clip:padding-box;border:0 solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#55595c;background-color:#f7f7f9;border-color:#8d8d8d;outline:0;box-shadow:0 0 0 .25rem rgba(26,26,26,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#919aa1;opacity:1}.form-control::placeholder{color:#919aa1;opacity:1}.form-control:disabled{background-color:#eceeef;opacity:1}.form-control::-webkit-file-upload-button{padding:.75rem 1.5rem;margin:-.75rem -1.5rem;-webkit-margin-end:1.5rem;margin-inline-end:1.5rem;color:#55595c;background-color:#eceeef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:0;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.75rem 1.5rem;margin:-.75rem -1.5rem;-webkit-margin-end:1.5rem;margin-inline-end:1.5rem;color:#55595c;background-color:#eceeef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:0;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#e0e2e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e0e2e3}.form-control-plaintext{display:block;width:100%;padding:.75rem 0;margin-bottom:0;line-height:1.5;color:#55595c;background-color:transparent;border:solid transparent;border-width:0 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 1rem);padding:.5rem 1rem;font-size:.875rem}.form-control-sm::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-sm::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg{min-height:calc(1.5em + 4rem);padding:2rem 2rem;font-size:1.25rem}.form-control-lg::-webkit-file-upload-button{padding:2rem 2rem;margin:-2rem -2rem;-webkit-margin-end:2rem;margin-inline-end:2rem}.form-control-lg::file-selector-button{padding:2rem 2rem;margin:-2rem -2rem;-webkit-margin-end:2rem;margin-inline-end:2rem}textarea.form-control{min-height:calc(1.5em + 1.5rem)}textarea.form-control-sm{min-height:calc(1.5em + 1rem)}textarea.form-control-lg{min-height:calc(1.5em + 4rem)}.form-control-color{width:3rem;height:calc(1.5em + 1.5rem);padding:.75rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important}.form-control-color.form-control-sm{height:calc(1.5em + 1rem)}.form-control-color.form-control-lg{height:calc(1.5em + 4rem)}.form-select{display:block;width:100%;padding:.75rem 4.5rem .75rem 1.5rem;-moz-padding-start:calc(1.5rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#55595c;background-color:#f7f7f9;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1.5rem center;background-size:16px 12px;border:0 solid #ced4da;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#8d8d8d;outline:0;box-shadow:0 0 0 .25rem rgba(26,26,26,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:1.5rem;background-image:none}.form-select:disabled{background-color:#f7f7f9}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #55595c}.form-select-sm{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:.875rem}.form-select-lg{padding-top:2rem;padding-bottom:2rem;padding-left:2rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#f7f7f9;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#8d8d8d;outline:0;box-shadow:0 0 0 .25rem rgba(26,26,26,.25)}.form-check-input:checked{background-color:#1a1a1a;border-color:#1a1a1a}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#1a1a1a;border-color:#1a1a1a;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%238d8d8d'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(26,26,26,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(26,26,26,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#1a1a1a;border:0;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bababa}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#eceeef;border-color:transparent}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#1a1a1a;border:0;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#bababa}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#eceeef;border-color:transparent}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:3.5rem;line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;width:100%;height:100%;padding:1rem 1.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:0 solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem 1.5rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:0 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.75rem 1.5rem;font-size:1rem;font-weight:400;line-height:1.5;color:#55595c;text-align:center;white-space:nowrap;background-color:#eceeef;border:0 solid #ced4da}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:2rem 2rem;font-size:1.25rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.5rem 1rem;font-size:.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:6rem}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select,.input-group>:not(:first-child):not(.dropdown-menu):not(.form-floating):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#4bbf73}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(75,191,115,.9)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#4bbf73;padding-right:calc(1.5em + 1.5rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%234bbf73' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .375rem) center;background-size:calc(.75em + .75rem) calc(.75em + .75rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#4bbf73;box-shadow:0 0 0 .25rem rgba(75,191,115,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 1.5rem);background-position:top calc(.375em + .375rem) right calc(.375em + .375rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#4bbf73}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:8.25rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%234bbf73' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right 1.5rem center,center right 4.5rem;background-size:16px 12px,calc(.75em + .75rem) calc(.75em + .75rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#4bbf73;box-shadow:0 0 0 .25rem rgba(75,191,115,.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + 1.5rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#4bbf73}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#4bbf73}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(75,191,115,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#4bbf73}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#d9534f}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(217,83,79,.9)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#d9534f;padding-right:calc(1.5em + 1.5rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23d9534f'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23d9534f' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .375rem) center;background-size:calc(.75em + .75rem) calc(.75em + .75rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#d9534f;box-shadow:0 0 0 .25rem rgba(217,83,79,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 1.5rem);background-position:top calc(.375em + .375rem) right calc(.375em + .375rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#d9534f}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:8.25rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23d9534f'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23d9534f' stroke='none'/%3e%3c/svg%3e");background-position:right 1.5rem center,center right 4.5rem;background-size:16px 12px,calc(.75em + .75rem) calc(.75em + .75rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#d9534f;box-shadow:0 0 0 .25rem rgba(217,83,79,.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + 1.5rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#d9534f}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#d9534f}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(217,83,79,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#d9534f}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{--bs-btn-padding-x:1.5rem;--bs-btn-padding-y:0.75rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:600;--bs-btn-line-height:1.5rem;--bs-btn-color:#55595c;--bs-btn-bg:transparent;--bs-btn-border-width:0;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check:focus+.btn,.btn:focus{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:active+.btn,.btn-check:checked+.btn,.btn.active,.btn.show,.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:active+.btn:focus,.btn-check:checked+.btn:focus,.btn.active:focus,.btn.show:focus,.btn:active:focus{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#1a1a1a;--bs-btn-border-color:#1a1a1a;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#161616;--bs-btn-hover-border-color:#151515;--bs-btn-focus-shadow-rgb:60,60,60;--bs-btn-active-color:#fff;--bs-btn-active-bg:#151515;--bs-btn-active-border-color:#141414;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#1a1a1a;--bs-btn-disabled-border-color:#1a1a1a}.btn-secondary{--bs-btn-color:#000;--bs-btn-bg:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:white;--bs-btn-hover-border-color:white;--bs-btn-focus-shadow-rgb:217,217,217;--bs-btn-active-color:#000;--bs-btn-active-bg:white;--bs-btn-active-border-color:white;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#fff;--bs-btn-disabled-border-color:#fff}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#4bbf73;--bs-btn-border-color:#4bbf73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#40a262;--bs-btn-hover-border-color:#3c995c;--bs-btn-focus-shadow-rgb:102,201,136;--bs-btn-active-color:#fff;--bs-btn-active-bg:#3c995c;--bs-btn-active-border-color:#388f56;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#4bbf73;--bs-btn-disabled-border-color:#4bbf73}.btn-info{--bs-btn-color:#fff;--bs-btn-bg:#1f9bcf;--bs-btn-border-color:#1f9bcf;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#1a84b0;--bs-btn-hover-border-color:#197ca6;--bs-btn-focus-shadow-rgb:65,170,214;--bs-btn-active-color:#fff;--bs-btn-active-bg:#197ca6;--bs-btn-active-border-color:#17749b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#1f9bcf;--bs-btn-disabled-border-color:#1f9bcf}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#f0ad4e;--bs-btn-border-color:#f0ad4e;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f2b969;--bs-btn-hover-border-color:#f2b560;--bs-btn-focus-shadow-rgb:204,147,66;--bs-btn-active-color:#000;--bs-btn-active-bg:#f3bd71;--bs-btn-active-border-color:#f2b560;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f0ad4e;--bs-btn-disabled-border-color:#f0ad4e}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#d9534f;--bs-btn-border-color:#d9534f;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#b84743;--bs-btn-hover-border-color:#ae423f;--bs-btn-focus-shadow-rgb:223,109,105;--bs-btn-active-color:#fff;--bs-btn-active-bg:#ae423f;--bs-btn-active-border-color:#a33e3b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#d9534f;--bs-btn-disabled-border-color:#d9534f}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d9d9d9;--bs-btn-hover-border-color:#cccccc;--bs-btn-focus-shadow-rgb:217,217,217;--bs-btn-active-color:#000;--bs-btn-active-bg:#cccccc;--bs-btn-active-border-color:#bfbfbf;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#fff;--bs-btn-disabled-border-color:#fff}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#52585d;--bs-btn-hover-border-color:#484e53;--bs-btn-focus-shadow-rgb:82,88,93;--bs-btn-active-color:#fff;--bs-btn-active-bg:#5d6166;--bs-btn-active-border-color:#484e53;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#343a40;--bs-btn-disabled-border-color:#343a40}.btn-outline-primary{--bs-btn-color:#1a1a1a;--bs-btn-border-color:#1a1a1a;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#1a1a1a;--bs-btn-hover-border-color:#1a1a1a;--bs-btn-focus-shadow-rgb:26,26,26;--bs-btn-active-color:#fff;--bs-btn-active-bg:#1a1a1a;--bs-btn-active-border-color:#1a1a1a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#1a1a1a;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#1a1a1a;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#fff;--bs-btn-hover-border-color:#fff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-active-color:#000;--bs-btn-active-bg:#fff;--bs-btn-active-border-color:#fff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#fff;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#4bbf73;--bs-btn-border-color:#4bbf73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#4bbf73;--bs-btn-hover-border-color:#4bbf73;--bs-btn-focus-shadow-rgb:75,191,115;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4bbf73;--bs-btn-active-border-color:#4bbf73;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#4bbf73;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#4bbf73;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#1f9bcf;--bs-btn-border-color:#1f9bcf;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#1f9bcf;--bs-btn-hover-border-color:#1f9bcf;--bs-btn-focus-shadow-rgb:31,155,207;--bs-btn-active-color:#fff;--bs-btn-active-bg:#1f9bcf;--bs-btn-active-border-color:#1f9bcf;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#1f9bcf;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#1f9bcf;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#f0ad4e;--bs-btn-border-color:#f0ad4e;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f0ad4e;--bs-btn-hover-border-color:#f0ad4e;--bs-btn-focus-shadow-rgb:240,173,78;--bs-btn-active-color:#000;--bs-btn-active-bg:#f0ad4e;--bs-btn-active-border-color:#f0ad4e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f0ad4e;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f0ad4e;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#d9534f;--bs-btn-border-color:#d9534f;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#d9534f;--bs-btn-hover-border-color:#d9534f;--bs-btn-focus-shadow-rgb:217,83,79;--bs-btn-active-color:#fff;--bs-btn-active-bg:#d9534f;--bs-btn-active-border-color:#d9534f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#d9534f;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#d9534f;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#fff;--bs-btn-hover-border-color:#fff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-active-color:#000;--bs-btn-active-bg:#fff;--bs-btn-active-border-color:#fff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#fff;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#343a40;--bs-btn-hover-border-color:#343a40;--bs-btn-focus-shadow-rgb:52,58,64;--bs-btn-active-color:#fff;--bs-btn-active-bg:#343a40;--bs-btn-active-border-color:#343a40;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#343a40;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#343a40;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#919aa1;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:60,60,60;text-decoration:underline}.btn-link:focus{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:2rem;--bs-btn-padding-x:2rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#55595c;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:#1a1a1a;--bs-dropdown-link-hover-color:#171717;--bs-dropdown-link-hover-bg:#f7f7f9;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#1a1a1a;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#919aa1;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:1000;display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#eceeef;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#eceeef;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#1a1a1a;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:0}.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:1.5rem;padding-left:1.5rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#919aa1;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#eceeef;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#f7f7f9 #f7f7f9 #eceeef;--bs-nav-tabs-link-active-color:#55595c;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#eceeef #eceeef #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(var(--bs-nav-tabs-border-width) * -1);background:0 0;border:var(--bs-nav-tabs-border-width) solid transparent}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(var(--bs-nav-tabs-border-width) * -1)}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#1a1a1a}.nav-pills .nav-link{background:0 0;border:0}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:1.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.3);--bs-navbar-hover-color:#1a1a1a;--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:#1a1a1a;--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:#1a1a1a;--bs-navbar-brand-hover-color:#1a1a1a;--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.3%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .show>.nav-link{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:#fff;--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion{--bs-accordion-color:#000;--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23171717'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#8d8d8d;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(26, 26, 26, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#171717;--bs-accordion-active-bg:#e8e8e8}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(var(--bs-accordion-border-width) * -1) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#919aa1;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#919aa1;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:transparent;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#f7f7f9;--bs-pagination-hover-border-color:transparent;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#f7f7f9;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(26, 26, 26, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#1a1a1a;--bs-pagination-active-border-color:#1a1a1a;--bs-pagination-disabled-color:#919aa1;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:transparent;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:#101010;--bs-alert-bg:#d1d1d1;--bs-alert-border-color:#bababa}.alert-primary .alert-link{color:#0d0d0d}.alert-secondary{--bs-alert-color:#999999;--bs-alert-bg:white;--bs-alert-border-color:white}.alert-secondary .alert-link{color:#7a7a7a}.alert-success{--bs-alert-color:#2d7345;--bs-alert-bg:#dbf2e3;--bs-alert-border-color:#c9ecd5}.alert-success .alert-link{color:#245c37}.alert-info{--bs-alert-color:#135d7c;--bs-alert-bg:#d2ebf5;--bs-alert-border-color:#bce1f1}.alert-info .alert-link{color:#0f4a63}.alert-warning{--bs-alert-color:#90682f;--bs-alert-bg:#fcefdc;--bs-alert-border-color:#fbe6ca}.alert-warning .alert-link{color:#735326}.alert-danger{--bs-alert-color:#82322f;--bs-alert-bg:#f7dddc;--bs-alert-border-color:#f4cbca}.alert-danger .alert-link{color:#682826}.alert-light{--bs-alert-color:#999999;--bs-alert-bg:white;--bs-alert-border-color:white}.alert-light .alert-link{color:#7a7a7a}.alert-dark{--bs-alert-color:#1f2326;--bs-alert-bg:#d6d8d9;--bs-alert-border-color:#c2c4c6}.alert-dark .alert-link{color:#191c1e}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#f7f7f9;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#1a1a1a;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{--bs-list-group-color:#1a1a1a;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#55595c;--bs-list-group-action-hover-color:#55595c;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#55595c;--bs-list-group-action-active-bg:#f7f7f9;--bs-list-group-disabled-color:#919aa1;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#1a1a1a;--bs-list-group-active-border-color:#1a1a1a;display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(var(--bs-list-group-border-width) * -1);border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(var(--bs-list-group-border-width) * -1);border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#101010;background-color:#d1d1d1}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#101010;background-color:#bcbcbc}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#101010;border-color:#101010}.list-group-item-secondary{color:#999;background-color:#fff}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#999;background-color:#e6e6e6}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#999;border-color:#999}.list-group-item-success{color:#2d7345;background-color:#dbf2e3}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#2d7345;background-color:#c5dacc}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#2d7345;border-color:#2d7345}.list-group-item-info{color:#135d7c;background-color:#d2ebf5}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#135d7c;background-color:#bdd4dd}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#135d7c;border-color:#135d7c}.list-group-item-warning{color:#90682f;background-color:#fcefdc}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#90682f;background-color:#e3d7c6}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#90682f;border-color:#90682f}.list-group-item-danger{color:#82322f;background-color:#f7dddc}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#82322f;background-color:#dec7c6}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#82322f;border-color:#82322f}.list-group-item-light{color:#999;background-color:#fff}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#999;background-color:#e6e6e6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#999;border-color:#999}.list-group-item-dark{color:#1f2326;background-color:#d6d8d9}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1f2326;background-color:#c1c2c3}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1f2326;border-color:#1f2326}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(26,26,26,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(255, 255, 255, 0.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color:#919aa1;--bs-toast-header-bg:rgba(255, 255, 255, 0.85);--bs-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{position:absolute;z-index:1090;width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(var(--bs-toast-padding-x) * -.5);margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(var(--bs-modal-header-padding-y) * -.5) calc(var(--bs-modal-header-padding-x) * -.5) calc(var(--bs-modal-header-padding-y) * -.5) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:var(--bs-heading-color);--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#55595c;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(var(--bs-popover-arrow-width) * -.5);content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(var(--bs-popover-arrow-height) * -1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;-webkit-animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:575.98px){.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}}@media (max-width:575.98px){.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:767.98px){.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}}@media (max-width:767.98px){.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:991.98px){.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}}@media (max-width:991.98px){.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1199.98px){.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}}@media (max-width:1199.98px){.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}}@media (max-width:1399.98px){.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(var(--bs-offcanvas-padding-y) * -.5);margin-right:calc(var(--bs-offcanvas-padding-x) * -.5);margin-bottom:calc(var(--bs-offcanvas-padding-y) * -.5)}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(26,26,26,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#000!important;background-color:RGBA(255,255,255,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(75,191,115,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#fff!important;background-color:RGBA(31,155,207,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(240,173,78,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(217,83,79,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(255,255,255,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(52,58,64,var(--bs-bg-opacity,1))!important}.link-primary{color:#1a1a1a!important}.link-primary:focus,.link-primary:hover{color:#151515!important}.link-secondary{color:#fff!important}.link-secondary:focus,.link-secondary:hover{color:#fff!important}.link-success{color:#4bbf73!important}.link-success:focus,.link-success:hover{color:#3c995c!important}.link-info{color:#1f9bcf!important}.link-info:focus,.link-info:hover{color:#197ca6!important}.link-warning{color:#f0ad4e!important}.link-warning:focus,.link-warning:hover{color:#f3bd71!important}.link-danger{color:#d9534f!important}.link-danger:focus,.link-danger:hover{color:#ae423f!important}.link-light{color:#fff!important}.link-light:focus,.link-light:hover{color:#fff!important}.link-dark{color:#343a40!important}.link-dark:focus,.link-dark:hover{color:#2a2e33!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.325rem + .9vw)!important}.fs-2{font-size:calc(1.3rem + .6vw)!important}.fs-3{font-size:calc(1.275rem + .3vw)!important}.fs-4{font-size:1.25rem!important}.fs-5{font-size:1rem!important}.fs-6{font-size:.75rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#919aa1!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2rem!important}.fs-2{font-size:1.75rem!important}.fs-3{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}.navbar{font-size:.875rem;font-weight:600;text-transform:uppercase}.navbar-nav .nav-link{padding-top:.715rem;padding-bottom:.715rem}.navbar-brand{margin-right:2rem}.bg-light{border:1px solid rgba(0,0,0,.1)}.bg-light.navbar-fixed-top{border-width:0 0 1px}.bg-light.navbar-bottom-top{border-width:1px 0 0}.nav-item{margin-right:2rem}.btn{font-size:.875rem;text-transform:uppercase}.btn-group-sm>.btn,.btn-sm{font-size:10px}.btn-warning,.btn-warning:focus,.btn-warning:hover,.btn-warning:not([disabled]):not(.disabled):active{color:#fff}.btn-outline-secondary{color:#919aa1;border-color:#919aa1}.btn-outline-secondary:not([disabled]):not(.disabled):active,.btn-outline-secondary:not([disabled]):not(.disabled):focus,.btn-outline-secondary:not([disabled]):not(.disabled):hover{color:#fff;background-color:#ced4da;border-color:#ced4da}.btn-outline-secondary:not([disabled]):not(.disabled):focus{box-shadow:0 0 0 .2rem rgba(206,212,218,.5)}[class*=btn-outline-]{border-width:2px}.border-secondary{border:1px solid #ced4da!important}body{font-weight:200;letter-spacing:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-transform:uppercase;letter-spacing:3px}.text-secondary{color:#55595c!important}th{font-size:.875rem;text-transform:uppercase}.table td,.table th{padding:1.5rem}.table-sm td,.table-sm th{padding:.75rem}.dropdown-menu{font-size:.875rem;text-transform:none}.badge{padding-top:.28rem}.badge-pill{border-radius:10rem}.badge.bg-light,.badge.bg-secondary{color:#343a40}.card .h1,.card .h2,.card .h3,.card .h4,.card .h5,.card .h6,.card h1,.card h2,.card h3,.card h4,.card h5,.card h6,.list-group-item .h1,.list-group-item .h2,.list-group-item .h3,.list-group-item .h4,.list-group-item .h5,.list-group-item .h6,.list-group-item h1,.list-group-item h2,.list-group-item h3,.list-group-item h4,.list-group-item h5,.list-group-item h6{color:inherit}
\ No newline at end of file
diff --git a/docs/assets/bootstrap/js/bootstrap.min.js b/docs/assets/bootstrap/js/bootstrap.min.js
deleted file mode 100644
index 2328c971..00000000
--- a/docs/assets/bootstrap/js/bootstrap.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Bootstrap v5.2.0 (https://getbootstrap.com/)
- * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},m=t=>{"function"==typeof t&&t()},_=(e,i,n=!0)=>{if(!n)return void m(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),m(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return C.has(o)||(o=t),[n,s,o]}function D(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return j(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return j(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function S(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const o of Object.keys(s))if(o.includes(n)){const n=s[o];S(t,e,i,n.callable,n.delegationSelector)}}function N(t){return t=t.replace(y,""),T[t]||t}const P={on(t,e,i,n){D(t,e,i,n,!1)},one(t,e,i,n){D(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const i of Object.keys(c)){const n=i.replace(w,"");if(!a||e.includes(n)){const e=c[i];S(t,l,r,e.callable,e.delegationSelector)}}}else{if(!Object.keys(c).length)return;S(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());let l=new Event(e,{bubbles:o,cancelable:!0});return l=j(l,i),a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function j(t,e){for(const[i,n]of Object.entries(e||{}))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}const M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};function $(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function W(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const B={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${W(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${W(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=$(t.dataset[n])}return e},getDataAttribute:(t,e)=>$(t.getAttribute(`data-bs-${W(e)}`))};class F{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?B.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?B.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const n of Object.keys(e)){const s=e[n],r=t[n],a=o(r)?"element":null==(i=r)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(a))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}var i}}class z extends F{constructor(t,e){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(e),H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.2.0"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;P.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class q extends z{static get NAME(){return"alert"}close(){if(P.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(q,"close"),g(q);const V='[data-bs-toggle="button"]';class K extends z{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=K.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}P.on(document,"click.bs.button.data-api",V,(t=>{t.preventDefault();const e=t.target.closest(V);K.getOrCreateInstance(e).toggle()})),g(K);const Q={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))}},X={endCallback:null,leftCallback:null,rightCallback:null},Y={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class U extends F{constructor(t,e){super(),this._element=t,t&&U.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return X}static get DefaultType(){return Y}static get NAME(){return"swipe"}dispose(){P.off(this._element,".bs.swipe")}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),m(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&m(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,"pointerdown.bs.swipe",(t=>this._start(t))),P.on(this._element,"pointerup.bs.swipe",(t=>this._end(t))),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.swipe",(t=>this._start(t))),P.on(this._element,"touchmove.bs.swipe",(t=>this._move(t))),P.on(this._element,"touchend.bs.swipe",(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const G="next",J="prev",Z="left",tt="right",et="slid.bs.carousel",it="carousel",nt="active",st={ArrowLeft:tt,ArrowRight:Z},ot={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},rt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class at extends z{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=Q.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===it&&this.cycle()}static get Default(){return ot}static get DefaultType(){return rt}static get NAME(){return"carousel"}next(){this._slide(G)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(J)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,et,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,et,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?G:J;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",(()=>this.pause())),P.on(this._element,"mouseleave.bs.carousel",(()=>this._maybeEnableCycle()))),this._config.touch&&U.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of Q.find(".carousel-item img",this._element))P.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(Z)),rightCallback:()=>this._slide(this._directionToOrder(tt)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new U(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=st[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=Q.findOne(".active",this._indicatorsElement);e.classList.remove(nt),e.removeAttribute("aria-current");const i=Q.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(nt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===G,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r("slide.bs.carousel").defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(nt),i.classList.remove(nt,c,l),this._isSliding=!1,r(et)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return Q.findOne(".active.carousel-item",this._element)}_getItems(){return Q.find(".carousel-item",this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===Z?J:G:t===Z?G:J}_orderToDirection(t){return p()?t===J?Z:tt:t===J?tt:Z}static jQueryInterface(t){return this.each((function(){const e=at.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",(function(t){const e=n(this);if(!e||!e.classList.contains(it))return;t.preventDefault();const i=at.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===B.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),P.on(window,"load.bs.carousel.data-api",(()=>{const t=Q.find('[data-bs-ride="carousel"]');for(const e of t)at.getOrCreateInstance(e)})),g(at);const lt="show",ct="collapse",ht="collapsing",dt='[data-bs-toggle="collapse"]',ut={parent:null,toggle:!0},ft={parent:"(null|element)",toggle:"boolean"};class pt extends z{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const n=Q.find(dt);for(const t of n){const e=i(t),n=Q.find(e).filter((t=>t===this._element));null!==e&&n.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return ut}static get DefaultType(){return ft}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>pt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[e]="",P.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);for(const t of this._triggerArray){const e=n(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),P.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(dt);for(const e of t){const t=n(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=Q.find(":scope .collapse .collapse",this._config.parent);return Q.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}P.on(document,"click.bs.collapse.data-api",dt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this),n=Q.find(e);for(const t of n)pt.getOrCreateInstance(t,{toggle:!1}).toggle()})),g(pt);var gt="top",mt="bottom",_t="right",bt="left",vt="auto",yt=[gt,mt,_t,bt],wt="start",At="end",Et="clippingParents",Tt="viewport",Ct="popper",Ot="reference",xt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+At])}),[]),kt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+At])}),[]),Lt="beforeRead",Dt="read",St="afterRead",It="beforeMain",Nt="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",$t=[Lt,Dt,St,It,Nt,Pt,jt,Mt,Ht];function Wt(t){return t?(t.nodeName||"").toLowerCase():null}function Bt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Ft(t){return t instanceof Bt(t).Element||t instanceof Element}function zt(t){return t instanceof Bt(t).HTMLElement||t instanceof HTMLElement}function Rt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Bt(t).ShadowRoot||t instanceof ShadowRoot)}const qt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Wt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Wt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Vt(t){return t.split("-")[0]}var Kt=Math.max,Qt=Math.min,Xt=Math.round;function Yt(t,e){void 0===e&&(e=!1);var i=t.getBoundingClientRect(),n=1,s=1;if(zt(t)&&e){var o=t.offsetHeight,r=t.offsetWidth;r>0&&(n=Xt(i.width)/r||1),o>0&&(s=Xt(i.height)/o||1)}return{width:i.width/n,height:i.height/s,top:i.top/s,right:i.right/n,bottom:i.bottom/s,left:i.left/n,x:i.left/n,y:i.top/s}}function Ut(t){var e=Yt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Gt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&Rt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Jt(t){return Bt(t).getComputedStyle(t)}function Zt(t){return["table","td","th"].indexOf(Wt(t))>=0}function te(t){return((Ft(t)?t.ownerDocument:t.document)||window.document).documentElement}function ee(t){return"html"===Wt(t)?t:t.assignedSlot||t.parentNode||(Rt(t)?t.host:null)||te(t)}function ie(t){return zt(t)&&"fixed"!==Jt(t).position?t.offsetParent:null}function ne(t){for(var e=Bt(t),i=ie(t);i&&Zt(i)&&"static"===Jt(i).position;)i=ie(i);return i&&("html"===Wt(i)||"body"===Wt(i)&&"static"===Jt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&zt(t)&&"fixed"===Jt(t).position)return null;var i=ee(t);for(Rt(i)&&(i=i.host);zt(i)&&["html","body"].indexOf(Wt(i))<0;){var n=Jt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function se(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function oe(t,e,i){return Kt(t,Qt(e,i))}function re(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ae(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const le={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Vt(i.placement),l=se(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return re("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ae(t,yt))}(s.padding,i),d=Ut(o),u="y"===l?gt:bt,f="y"===l?mt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],g=r[l]-i.rects.reference[l],m=ne(o),_=m?"y"===l?m.clientHeight||0:m.clientWidth||0:0,b=p/2-g/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=oe(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Gt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ce(t){return t.split("-")[1]}var he={top:"auto",right:"auto",bottom:"auto",left:"auto"};function de(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,g=void 0===p?0:p,m="function"==typeof h?h({x:f,y:g}):{x:f,y:g};f=m.x,g=m.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=bt,y=gt,w=window;if(c){var A=ne(i),E="clientHeight",T="clientWidth";A===Bt(i)&&"static"!==Jt(A=te(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===gt||(s===bt||s===_t)&&o===At)&&(y=mt,g-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,g*=l?1:-1),s!==bt&&(s!==gt&&s!==mt||o!==At)||(v=_t,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&he),x=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:Xt(e*n)/n||0,y:Xt(i*n)/n||0}}({x:f,y:g}):{x:f,y:g};return f=x.x,g=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+g+"px)":"translate3d("+f+"px, "+g+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?g+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const ue={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Vt(e.placement),variation:ce(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,de(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,de(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var fe={passive:!0};const pe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Bt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,fe)})),a&&l.addEventListener("resize",i.update,fe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,fe)})),a&&l.removeEventListener("resize",i.update,fe)}},data:{}};var ge={left:"right",right:"left",bottom:"top",top:"bottom"};function me(t){return t.replace(/left|right|bottom|top/g,(function(t){return ge[t]}))}var _e={start:"end",end:"start"};function be(t){return t.replace(/start|end/g,(function(t){return _e[t]}))}function ve(t){var e=Bt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ye(t){return Yt(te(t)).left+ve(t).scrollLeft}function we(t){var e=Jt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ae(t){return["html","body","#document"].indexOf(Wt(t))>=0?t.ownerDocument.body:zt(t)&&we(t)?t:Ae(ee(t))}function Ee(t,e){var i;void 0===e&&(e=[]);var n=Ae(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Bt(n),r=s?[o].concat(o.visualViewport||[],we(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ee(ee(r)))}function Te(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Ce(t,e){return e===Tt?Te(function(t){var e=Bt(t),i=te(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+ye(t),y:a}}(t)):Ft(e)?function(t){var e=Yt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Te(function(t){var e,i=te(t),n=ve(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Kt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Kt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ye(t),l=-n.scrollTop;return"rtl"===Jt(s||i).direction&&(a+=Kt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(te(t)))}function Oe(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Vt(s):null,r=s?ce(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case gt:e={x:a,y:i.y-n.height};break;case mt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?se(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case At:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function xe(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?Et:o,a=i.rootBoundary,l=void 0===a?Tt:a,c=i.elementContext,h=void 0===c?Ct:c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,g=re("number"!=typeof p?p:ae(p,yt)),m=h===Ct?Ot:Ct,_=t.rects.popper,b=t.elements[u?m:h],v=function(t,e,i){var n="clippingParents"===e?function(t){var e=Ee(ee(t)),i=["absolute","fixed"].indexOf(Jt(t).position)>=0&&zt(t)?ne(t):t;return Ft(i)?e.filter((function(t){return Ft(t)&&Gt(t,i)&&"body"!==Wt(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Ce(t,i);return e.top=Kt(n.top,e.top),e.right=Qt(n.right,e.right),e.bottom=Qt(n.bottom,e.bottom),e.left=Kt(n.left,e.left),e}),Ce(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}(Ft(b)?b:b.contextElement||te(t.elements.popper),r,l),y=Yt(t.elements.reference),w=Oe({reference:y,element:_,strategy:"absolute",placement:s}),A=Te(Object.assign({},_,w)),E=h===Ct?A:y,T={top:v.top-E.top+g.top,bottom:E.bottom-v.bottom+g.bottom,left:v.left-E.left+g.left,right:E.right-v.right+g.right},C=t.modifiersData.offset;if(h===Ct&&C){var O=C[s];Object.keys(T).forEach((function(t){var e=[_t,mt].indexOf(t)>=0?1:-1,i=[gt,mt].indexOf(t)>=0?"y":"x";T[t]+=O[i]*e}))}return T}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?kt:l,h=ce(n),d=h?a?xt:xt.filter((function(t){return ce(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=xe(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Vt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const Le={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,g=i.allowedAutoPlacements,m=e.options.placement,_=Vt(m),b=l||(_!==m&&p?function(t){if(Vt(t)===vt)return[];var e=me(t);return[be(t),e,be(e)]}(m):[me(m)]),v=[m].concat(b).reduce((function(t,i){return t.concat(Vt(i)===vt?ke(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:g}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,D=L?"width":"height",S=xe(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),I=L?k?_t:bt:k?mt:gt;y[D]>w[D]&&(I=me(I));var N=me(I),P=[];if(o&&P.push(S[x]<=0),a&&P.push(S[I]<=0,S[N]<=0),P.every((function(t){return t}))){T=O,E=!1;break}A.set(O,P)}if(E)for(var j=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Se(t){return[gt,_t,mt,bt].some((function(e){return t[e]>=0}))}const Ie={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=xe(e,{elementContext:"reference"}),a=xe(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Se(l),d=Se(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Ne={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=kt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Vt(t),s=[bt,gt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Pe={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Oe({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,g=void 0===p?0:p,m=xe(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Vt(e.placement),b=ce(e.placement),v=!b,y=se(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof g?g(Object.assign({},e.rects,{placement:e.placement})):g,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,D="y"===y?gt:bt,S="y"===y?mt:_t,I="y"===y?"height":"width",N=A[y],P=N+m[D],j=N-m[S],M=f?-T[I]/2:0,H=b===wt?E[I]:T[I],$=b===wt?-T[I]:-E[I],W=e.elements.arrow,B=f&&W?Ut(W):{width:0,height:0},F=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=F[D],R=F[S],q=oe(0,E[I],B[I]),V=v?E[I]/2-M-q-z-O.mainAxis:H-q-z-O.mainAxis,K=v?-E[I]/2+M+q+R+O.mainAxis:$+q+R+O.mainAxis,Q=e.elements.arrow&&ne(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=N+K-Y,G=oe(f?Qt(P,N+V-Y-X):P,N,f?Kt(j,U):j);A[y]=G,k[y]=G-N}if(a){var J,Z="x"===y?gt:bt,tt="x"===y?mt:_t,et=A[w],it="y"===w?"height":"width",nt=et+m[Z],st=et-m[tt],ot=-1!==[gt,bt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=oe(t,e,i);return n>i?i:n}(at,et,lt):oe(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function Me(t,e,i){void 0===i&&(i=!1);var n,s,o=zt(e),r=zt(e)&&function(t){var e=t.getBoundingClientRect(),i=Xt(e.width)/t.offsetWidth||1,n=Xt(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=te(e),l=Yt(t,r),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==Wt(e)||we(a))&&(c=(n=e)!==Bt(n)&&zt(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ve(n)),zt(e)?((h=Yt(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var $e={placement:"bottom",modifiers:[],strategy:"absolute"};function We(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(B.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=Q.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Qe,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=Q.find(Je);for(const i of e){const e=li.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ke,Qe].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=Q.findOne(Ge,t.delegateTarget.parentNode),o=li.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ye,Ge,li.dataApiKeydownHandler),P.on(document,Ye,Ze,li.dataApiKeydownHandler),P.on(document,Xe,li.clearMenus),P.on(document,"keyup.bs.dropdown.data-api",li.clearMenus),P.on(document,Xe,Ge,(function(t){t.preventDefault(),li.getOrCreateInstance(this).toggle()})),g(li);const ci=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",hi=".sticky-top",di="padding-right",ui="margin-right";class fi{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,di,(e=>e+t)),this._setElementAttributes(ci,di,(e=>e+t)),this._setElementAttributes(hi,ui,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,di),this._resetElementAttributes(ci,di),this._resetElementAttributes(hi,ui)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&B.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=B.getDataAttribute(t,e);null!==i?(B.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of Q.find(t,this._element))e(i)}}const pi="show",gi="mousedown.bs.backdrop",mi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},_i={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class bi extends F{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return mi}static get DefaultType(){return _i}static get NAME(){return"backdrop"}show(t){if(!this._config.isVisible)return void m(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(pi),this._emulateAnimation((()=>{m(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(pi),this._emulateAnimation((()=>{this.dispose(),m(t)}))):m(t)}dispose(){this._isAppended&&(P.off(this._element,gi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,gi,(()=>{m(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const vi=".bs.focustrap",yi="backward",wi={autofocus:!0,trapElement:null},Ai={autofocus:"boolean",trapElement:"element"};class Ei extends F{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return wi}static get DefaultType(){return Ai}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,vi),P.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),P.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,vi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=Q.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===yi?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?yi:"forward")}}const Ti="hidden.bs.modal",Ci="show.bs.modal",Oi="modal-open",xi="show",ki="modal-static",Li={backdrop:!0,focus:!0,keyboard:!0},Di={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Si extends z{constructor(t,e){super(t,e),this._dialog=Q.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new fi,this._addEventListeners()}static get Default(){return Li}static get DefaultType(){return Di}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,Ci,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Oi),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(xi),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){for(const t of[window,this._dialog])P.off(t,".bs.modal");this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ei({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=Q.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(xi),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.modal",(t=>{if("Escape"===t.key)return this._config.keyboard?(t.preventDefault(),void this.hide()):void this._triggerBackdropTransition()})),P.on(window,"resize.bs.modal",(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),P.on(this._element,"mousedown.dismiss.bs.modal",(t=>{t.target===t.currentTarget&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Oi),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,Ti)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(ki)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(ki),this._queueCallback((()=>{this._element.classList.remove(ki),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Si.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,Ci,(t=>{t.defaultPrevented||P.one(e,Ti,(()=>{a(this)&&this.focus()}))}));const i=Q.findOne(".modal.show");i&&Si.getInstance(i).hide(),Si.getOrCreateInstance(e).toggle(this)})),R(Si),g(Si);const Ii="show",Ni="showing",Pi="hiding",ji=".offcanvas.show",Mi="hidePrevented.bs.offcanvas",Hi="hidden.bs.offcanvas",$i={backdrop:!0,keyboard:!0,scroll:!1},Wi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Bi extends z{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return $i}static get DefaultType(){return Wi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new fi).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Ni),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Ii),this._element.classList.remove(Ni),P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pi),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Ii,Pi),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new fi).reset(),P.trigger(this._element,Hi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new bi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,Mi)}:null})}_initializeFocusTrap(){return new Ei({trapElement:this._element})}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,Mi))}))}static jQueryInterface(t){return this.each((function(){const e=Bi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;P.one(e,Hi,(()=>{a(this)&&this.focus()}));const i=Q.findOne(ji);i&&i!==e&&Bi.getInstance(i).hide(),Bi.getOrCreateInstance(e).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",(()=>{for(const t of Q.find(ji))Bi.getOrCreateInstance(t).show()})),P.on(window,"resize.bs.offcanvas",(()=>{for(const t of Q.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Bi.getOrCreateInstance(t).hide()})),R(Bi),g(Bi);const Fi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),zi=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Ri=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,qi=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Fi.has(i)||Boolean(zi.test(t.nodeValue)||Ri.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Vi={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Ki={allowList:Vi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Qi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Xi={entry:"(string|element|function|null)",selector:"(string|element)"};class Yi extends F{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Ki}static get DefaultType(){return Qi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Xi)}_setContent(t,e,i){const n=Q.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)qi(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return"function"==typeof t?t(this):t}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Ui=new Set(["sanitize","allowList","sanitizeFn"]),Gi="fade",Ji="show",Zi=".modal",tn="hide.bs.modal",en="hover",nn="focus",sn={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},on={allowList:Vi,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,0],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},rn={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class an extends z{constructor(t,e){if(void 0===qe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=!1,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners()}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled){if(t){const e=this._initializeOnDelegatedTarget(t);return e._activeTrigger.click=!e._activeTrigger.click,void(e._isWithActiveTrigger()?e._enter():e._leave())}this._isShown()?this._leave():this._enter()}}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(Zi),tn,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this.tip&&(this.tip.remove(),this.tip=null);const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper?this._popper.update():this._popper=this._createPopper(i),i.classList.add(Ji),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._queueCallback((()=>{const t=this._isHovered;this._isHovered=!1,P.trigger(this._element,this.constructor.eventName("shown")),t&&this._leave()}),this.tip,this._isAnimated())}hide(){if(!this._isShown())return;if(P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented)return;const t=this._getTipElement();if(t.classList.remove(Ji),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this._isHovered=!1,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||t.remove(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")),this._disposePopper())}),this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Gi,Ji),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Gi),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Yi({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._config.originalTitle}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Gi)}_isShown(){return this.tip&&this.tip.classList.contains(Ji)}_createPopper(t){const e="function"==typeof this._config.placement?this._config.placement.call(this,t,this._element):this._config.placement,i=sn[e.toUpperCase()];return Re(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>this.toggle(t)));else if("manual"!==e){const t=e===en?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===en?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?nn:en]=!0,e._enter()})),P.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?nn:en]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(Zi),tn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._config.originalTitle;t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=B.getDataAttributes(this._element);for(const t of Object.keys(e))Ui.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.originalTitle=this._element.getAttribute("title")||"","number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=an.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(an);const ln={...an.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},cn={...an.DefaultType,content:"(null|string|element|function)"};class hn extends an{static get Default(){return ln}static get DefaultType(){return cn}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=hn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(hn);const dn="click.bs.scrollspy",un="active",fn="[href]",pn={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null},gn={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element"};class mn extends z{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return pn}static get DefaultType(){return gn}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,dn),P.on(this._config.target,dn,fn,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:[.1,.5,1],rootMargin:this._getRootMargin()};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_getRootMargin(){return this._config.offset?`${this._config.offset}px 0px -30%`:this._config.rootMargin}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=Q.find(fn,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=Q.findOne(e.hash,this._element);a(t)&&(this._targetLinks.set(e.hash,e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(un),this._activateParents(t),P.trigger(this._element,"activate.bs.scrollspy",{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))Q.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(un);else for(const e of Q.parents(t,".nav, .list-group"))for(const t of Q.prev(e,".nav-link, .nav-item > .nav-link, .list-group-item"))t.classList.add(un)}_clearActiveClass(t){t.classList.remove(un);const e=Q.find("[href].active",t);for(const t of e)t.classList.remove(un)}static jQueryInterface(t){return this.each((function(){const e=mn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",(()=>{for(const t of Q.find('[data-bs-spy="scroll"]'))mn.getOrCreateInstance(t)})),g(mn);const _n="ArrowLeft",bn="ArrowRight",vn="ArrowUp",yn="ArrowDown",wn="active",An="fade",En="show",Tn='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Cn=`.nav-link:not(.dropdown-toggle), .list-group-item:not(.dropdown-toggle), [role="tab"]:not(.dropdown-toggle), ${Tn}`;class On extends z{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,"keydown.bs.tab",(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,"hide.bs.tab",{relatedTarget:t}):null;P.trigger(t,"show.bs.tab",{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(wn),this._activate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.focus(),t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,"shown.bs.tab",{relatedTarget:e})):t.classList.add(En)}),t,t.classList.contains(An)))}_deactivate(t,e){t&&(t.classList.remove(wn),t.blur(),this._deactivate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,"hidden.bs.tab",{relatedTarget:e})):t.classList.remove(En)}),t,t.classList.contains(An)))}_keydown(t){if(![_n,bn,vn,yn].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[bn,yn].includes(t.key),i=b(this._getChildren().filter((t=>!l(t))),t.target,e,!0);i&&On.getOrCreateInstance(i).show()}_getChildren(){return Q.find(Cn,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=n(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`#${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=Q.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",wn),n(".dropdown-menu",En),n(".dropdown-item",wn),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(wn)}_getInnerElement(t){return t.matches(Cn)?t:Q.findOne(Cn,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=On.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab",Tn,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||On.getOrCreateInstance(this).show()})),P.on(window,"load.bs.tab",(()=>{for(const t of Q.find('.active[data-bs-toggle="tab"], .active[data-bs-toggle="pill"], .active[data-bs-toggle="list"]'))On.getOrCreateInstance(t)})),g(On);const xn="hide",kn="show",Ln="showing",Dn={animation:"boolean",autohide:"boolean",delay:"number"},Sn={animation:!0,autohide:!0,delay:5e3};class In extends z{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Sn}static get DefaultType(){return Dn}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(xn),d(this._element),this._element.classList.add(kn,Ln),this._queueCallback((()=>{this._element.classList.remove(Ln),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(Ln),this._queueCallback((()=>{this._element.classList.add(xn),this._element.classList.remove(Ln,kn),P.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(kn),super.dispose()}isShown(){return this._element.classList.contains(kn)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),P.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=In.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(In),g(In),{Alert:q,Button:K,Carousel:at,Collapse:pt,Dropdown:li,Modal:Si,Offcanvas:Bi,Popover:hn,ScrollSpy:mn,Tab:On,Toast:In,Tooltip:an}}));
diff --git a/docs/assets/css/Features-Clean.css b/docs/assets/css/Features-Clean.css
deleted file mode 100644
index 5dbb37c9..00000000
--- a/docs/assets/css/Features-Clean.css
+++ /dev/null
@@ -1,75 +0,0 @@
-.features-clean {
- color: #313437;
- background-color: #fff;
- padding-bottom: 30px;
-}
-
-@media (max-width:767px) {
- .features-clean {
- padding-bottom: 10px;
- }
-}
-
-.features-clean p {
- color: #7d8285;
-}
-
-.features-clean h2 {
- font-weight: bold;
- margin-bottom: 40px;
- padding-top: 40px;
- color: inherit;
-}
-
-@media (max-width:767px) {
- .features-clean h2 {
- margin-bottom: 25px;
- padding-top: 25px;
- font-size: 24px;
- }
-}
-
-.features-clean .intro {
- font-size: 16px;
- max-width: 500px;
- margin: 0 auto 60px;
-}
-
-@media (max-width:767px) {
- .features-clean .intro {
- margin-bottom: 40px;
- }
-}
-
-.features-clean .item {
- min-height: 100px;
- padding-left: 80px;
- margin-bottom: 40px;
-}
-
-@media (max-width:767px) {
- .features-clean .item {
- min-height: 0;
- }
-}
-
-.features-clean .item .name {
- font-size: 20px;
- font-weight: bold;
- margin-top: 0;
- margin-bottom: 20px;
- color: inherit;
-}
-
-.features-clean .item .description {
- font-size: 15px;
- margin-bottom: 0;
-}
-
-.features-clean .item .icon {
- font-size: 40px;
- color: #1485ee;
- float: left;
- margin-left: -65px;
-}
-
diff --git a/docs/assets/css/Footer-Basic.css b/docs/assets/css/Footer-Basic.css
deleted file mode 100644
index 985cf4a8..00000000
--- a/docs/assets/css/Footer-Basic.css
+++ /dev/null
@@ -1,60 +0,0 @@
-.footer-basic {
- padding: 40px 0;
- background-color: #ffffff;
- color: #4b4c4d;
-}
-
-.footer-basic ul {
- padding: 0;
- list-style: none;
- text-align: center;
- font-size: 18px;
- line-height: 1.6;
- margin-bottom: 0;
-}
-
-.footer-basic li {
- padding: 0 10px;
-}
-
-.footer-basic ul a {
- color: inherit;
- text-decoration: none;
- opacity: 0.8;
-}
-
-.footer-basic ul a:hover {
- opacity: 1;
-}
-
-.footer-basic .social {
- text-align: center;
- padding-bottom: 25px;
-}
-
-.footer-basic .social > a {
- font-size: 24px;
- width: 40px;
- height: 40px;
- line-height: 40px;
- display: inline-block;
- text-align: center;
- border-radius: 50%;
- border: 1px solid #ccc;
- margin: 0 8px;
- color: inherit;
- opacity: 0.75;
-}
-
-.footer-basic .social > a:hover {
- opacity: 0.9;
-}
-
-.footer-basic .copyright {
- margin-top: 15px;
- text-align: center;
- font-size: 13px;
- color: #aaa;
- margin-bottom: 0;
-}
-
diff --git a/docs/assets/css/Header-Blue.css b/docs/assets/css/Header-Blue.css
deleted file mode 100644
index d650f37e..00000000
--- a/docs/assets/css/Header-Blue.css
+++ /dev/null
@@ -1,217 +0,0 @@
-.header-blue {
- background: linear-gradient(135deg, #172a74, #21a9af);
- background-color: #184e8e;
- padding-bottom: 80px;
- font-family: 'Source Sans Pro', sans-serif;
-}
-
-@media (min-width:768px) {
- .header-blue {
- padding-bottom: 120px;
- }
-}
-
-.header-blue .navbar {
- background: transparent;
- padding-top: .75rem;
- padding-bottom: .75rem;
- color: #fff;
- border-radius: 0;
- box-shadow: none;
- border: none;
-}
-
-@media (min-width:768px) {
- .header-blue .navbar {
- padding-top: 1rem;
- padding-bottom: 1rem;
- }
-}
-
-.header-blue .navbar .navbar-brand {
- font-weight: bold;
- color: inherit;
-}
-
-.header-blue .navbar .navbar-brand:hover {
- color: #f0f0f0;
-}
-
-.header-blue .navbar .navbar-collapse {
- border-top: 1px solid rgba(255,255,255,0.3);
- margin-top: .5rem;
-}
-
-@media (min-width:768px) {
- .header-blue .navbar .navbar-collapse {
- border-color: transparent;
- margin: 0;
- }
-}
-
-.header-blue .navbar .navbar-collapse span .login {
- color: #d9d9d9;
- margin-right: .5rem;
- text-decoration: none;
-}
-
-.header-blue .navbar .navbar-collapse span .login:hover {
- color: #fff;
-}
-
-.header-blue .navbar .navbar-toggler {
- border-color: rgba(255,255,255,0.3);
-}
-
-.header-blue .navbar .navbar-toggler:hover, .header-blue .navbar-toggler:focus {
- background: none;
-}
-
-@media (min-width: 768px) {
- .header-blue .navbar-nav .nav-link {
- padding-left: .7rem;
- padding-right: .7rem;
- }
-}
-
-@media (min-width: 992px) {
- .header-blue .navbar-nav .nav-link {
- padding-left: 1.2rem;
- padding-right: 1.2rem;
- }
-}
-
-.header-blue .navbar .navbar-nav > li > .dropdown-menu {
- margin-top: -5px;
- box-shadow: 0 4px 8px rgba(0,0,0,.1);
- background-color: #fff;
- border-radius: 2px;
-}
-
-.header-blue .navbar .dropdown-menu .dropdown-item:focus, .header-blue .navbar .dropdown-menu .dropdown-item {
- line-height: 2;
- color: #37434d;
-}
-
-.header-blue .navbar .dropdown-menu .dropdown-item:focus, .header-blue .navbar .dropdown-menu .dropdown-item:hover {
- background: #ebeff1;
-}
-
-.header-blue .action-button, .header-blue .action-button:not(.disabled):active {
- border: 1px solid rgba(255,255,255,0.7);
- border-radius: 40px;
- color: #ebeff1;
- box-shadow: none;
- text-shadow: none;
- padding: .3rem .8rem;
- background: transparent;
- transition: background-color 0.25s;
- outline: none;
-}
-
-.header-blue .action-button:hover {
- color: #fff;
-}
-
-.header-blue .navbar form label {
- color: #d9d9d9;
-}
-
-.header-blue .navbar form .search-field {
- display: inline-block;
- width: 80%;
- background: none;
- border: none;
- border-bottom: 1px solid transparent;
- border-radius: 0;
- color: #ccc;
- box-shadow: none;
- color: inherit;
- transition: border-bottom-color 0.3s;
-}
-
-.header-blue .navbar form .search-field:focus {
- border-bottom: 1px solid #ccc;
-}
-
-.header-blue .hero {
- margin-top: 20px;
- text-align: center;
-}
-
-@media (min-width:768px) {
- .header-blue .hero {
- margin-top: 60px;
- text-align: left;
- }
-}
-
-.header-blue .hero h1 {
- color: #fff;
- font-size: 40px;
- margin-top: 0;
- margin-bottom: 15px;
- font-weight: 300;
- line-height: 1.4;
-}
-
-@media (min-width:992px) {
- .header-blue .hero h1 {
- margin-top: 190px;
- margin-bottom: 24px;
- line-height: 1.2;
- }
-}
-
-.header-blue .hero p {
- color: rgba(255,255,255,0.8);
- font-size: 20px;
- margin-bottom: 30px;
- font-weight: 300;
-}
-
-.header-blue .phone-holder {
- text-align: right;
-}
-
-.header-blue div.phone-mockup {
- position: relative;
- max-width: 300px;
- margin: 20px;
- display: inline-block;
- z-index: 1;
-}
-
-.header-blue .phone-mockup img.device {
- width: 100%;
- height: auto;
-}
-
-.header-blue .phone-mockup .screen {
- position: absolute;
- width: 94%;
- height: 98%;
- top: 1%;
- left: 3%;
- border: 1px solid #444;
- border-radius: 20px;
- background-color: #aaa;
- overflow: hidden;
- background: url(screen-content-phone.jpg);
- background-size: cover;
- background-position: center;
- z-index: -1;
-}
-
-.header-blue .phone-mockup .screen:before {
- content: '';
- background-color: #fff;
- position: absolute;
- width: 70%;
- height: 140%;
- top: -12%;
- right: -60%;
- transform: rotate(-19deg);
- opacity: 0.2;
-}
-
diff --git a/docs/assets/css/Highlight-Blue.css b/docs/assets/css/Highlight-Blue.css
deleted file mode 100644
index dc24e054..00000000
--- a/docs/assets/css/Highlight-Blue.css
+++ /dev/null
@@ -1,64 +0,0 @@
-.highlight-blue {
- color: #fff;
- background-color: #1e6add;
- padding: 50px 0;
-}
-
-.highlight-blue p {
- color: #c4d5ef;
- line-height: 1.5;
-}
-
-.highlight-blue h2 {
- font-weight: normal;
- margin-bottom: 25px;
- line-height: 1.5;
- padding-top: 0;
- margin-top: 0;
- color: inherit;
-}
-
-.highlight-blue .intro {
- font-size: 16px;
- max-width: 500px;
- margin: 0 auto 25px;
-}
-
-.highlight-blue .buttons {
- text-align: center;
-}
-
-.highlight-blue .buttons .btn {
- padding: 16px 32px;
- margin: 6px;
- border: none;
- background: none;
- box-shadow: none;
- text-shadow: none;
- opacity: 0.9;
- text-transform: uppercase;
- font-weight: bold;
- font-size: 13px;
- letter-spacing: 0.4px;
- line-height: 1;
-}
-
-.highlight-blue .buttons .btn:hover {
- opacity: 1;
-}
-
-.highlight-blue .buttons .btn:active {
- transform: translateY(1px);
-}
-
-.highlight-blue .buttons .btn-primary, .highlight-blue .buttons .btn-primary:active {
- border: 2px solid rgba(255,255,255,0.7);
- border-radius: 6px;
- color: #ebeff1;
- box-shadow: none;
- text-shadow: none;
- padding: 14px 24px;
- background: transparent;
- transition: background-color 0.25s;
-}
-
diff --git a/docs/assets/css/Highlight-Clean.css b/docs/assets/css/Highlight-Clean.css
deleted file mode 100644
index 01ddd1bd..00000000
--- a/docs/assets/css/Highlight-Clean.css
+++ /dev/null
@@ -1,59 +0,0 @@
-.highlight-clean {
- color: #313437;
- background-color: #fff;
- padding: 50px 0;
-}
-
-.highlight-clean p {
- color: #7d8285;
-}
-
-.highlight-clean h2 {
- font-weight: bold;
- margin-bottom: 25px;
- line-height: 1.5;
- padding-top: 0;
- margin-top: 0;
- color: inherit;
-}
-
-.highlight-clean .intro {
- font-size: 16px;
- max-width: 500px;
- margin: 0 auto 25px;
-}
-
-.highlight-clean .buttons {
- text-align: center;
-}
-
-.highlight-clean .buttons .btn {
- padding: 16px 32px;
- margin: 6px;
- border: none;
- background: none;
- box-shadow: none;
- text-shadow: none;
- opacity: 0.9;
- text-transform: uppercase;
- font-weight: bold;
- font-size: 13px;
- letter-spacing: 0.4px;
- line-height: 1;
- outline: none;
- background-color: #ddd;
-}
-
-.highlight-clean .buttons .btn:hover {
- opacity: 1;
-}
-
-.highlight-clean .buttons .btn:active {
- transform: translateY(1px);
-}
-
-.highlight-clean .buttons .btn-primary {
- background-color: #055ada;
- color: #fff;
-}
-
diff --git a/docs/assets/css/Navigation-Clean.css b/docs/assets/css/Navigation-Clean.css
deleted file mode 100644
index 1df4fd3e..00000000
--- a/docs/assets/css/Navigation-Clean.css
+++ /dev/null
@@ -1,77 +0,0 @@
-.navigation-clean {
- background: #ffffff;
- padding-top: .75rem;
- padding-bottom: .75rem;
- color: #333;
- border-radius: 0;
- box-shadow: none;
- border: none;
- margin-bottom: 0;
-}
-
-@media (min-width:768px) {
- .navigation-clean {
- padding-top: 1rem;
- padding-bottom: 1rem;
- }
-}
-
-.navigation-clean .navbar-brand {
- font-weight: bold;
- color: inherit;
-}
-
-.navigation-clean .navbar-brand:hover {
- color: #222;
-}
-
-.navigation-clean .navbar-toggler {
- border-color: #ddd;
-}
-
-.navigation-clean .navbar-toggler:hover, .navigation-clean .navbar-toggler:focus {
- background: none;
-}
-
-.navigation-clean .navbar-toggler {
- color: #888;
-}
-
-.navigation-clean.navbar-light .navbar-nav .nav-link.active, .navigation-clean.navbar-light .navbar-nav .nav-link.active:focus, .navigation-clean.navbar-light .navbar-nav .nav-link.active:hover {
- color: #8f8f8f;
- box-shadow: none;
- background: none;
- pointer-events: none;
-}
-
-.navigation-clean.navbar .navbar-nav .nav-link {
- padding-left: 18px;
- padding-right: 18px;
-}
-
-.navigation-clean.navbar-light .navbar-nav .nav-link {
- color: #465765;
-}
-
-.navigation-clean.navbar-light .navbar-nav .nav-link:focus, .navigation-clean.navbar-light .navbar-nav .nav-link:hover {
- color: #37434d !important;
- background-color: transparent;
-}
-
-.navigation-clean .navbar-nav > li > .dropdown-menu {
- margin-top: -5px;
- box-shadow: none;
- background-color: #fff;
- border-radius: 2px;
-}
-
-.navigation-clean .dropdown-menu .dropdown-item:focus, .navigation-clean .dropdown-menu .dropdown-item {
- line-height: 2;
- color: #37434d;
-}
-
-.navigation-clean .dropdown-menu .dropdown-item:focus, .navigation-clean .dropdown-menu .dropdown-item:hover {
- background: #eee;
- color: inherit;
-}
-
diff --git a/docs/assets/css/Simple-Slider-Simple-Slider.css b/docs/assets/css/Simple-Slider-Simple-Slider.css
deleted file mode 100644
index e18d712d..00000000
--- a/docs/assets/css/Simple-Slider-Simple-Slider.css
+++ /dev/null
@@ -1,25 +0,0 @@
-.simple-slider .swiper-slide {
- height: 500px;
- background-repeat: no-repeat;
- background-size: cover;
- background-position: center;
-}
-
-.simple-slider .swiper-button-next, .simple-slider .swiper-button-prev {
- width: 50px;
- margin-left: 20px;
- margin-right: 20px;
-}
-
-@media (max-width:767px) {
- .simple-slider .swiper-button-next, .simple-slider .swiper-button-prev {
- display: none;
- }
-}
-
-@media (max-width:767px) {
- .simple-slider .swiper-slide {
- height: 360px;
- }
-}
-
diff --git a/docs/assets/fonts/FontAwesome.otf b/docs/assets/fonts/FontAwesome.otf
deleted file mode 100644
index 401ec0f3..00000000
Binary files a/docs/assets/fonts/FontAwesome.otf and /dev/null differ
diff --git a/docs/assets/fonts/fa-brands-400.eot b/docs/assets/fonts/fa-brands-400.eot
deleted file mode 100644
index baf40576..00000000
Binary files a/docs/assets/fonts/fa-brands-400.eot and /dev/null differ
diff --git a/docs/assets/fonts/fa-brands-400.svg b/docs/assets/fonts/fa-brands-400.svg
deleted file mode 100644
index 843c1c78..00000000
--- a/docs/assets/fonts/fa-brands-400.svg
+++ /dev/null
@@ -1,3535 +0,0 @@
-
-
-
-
-
-Created by FontForge 20190801 at Tue Dec 10 16:09:21 2019
- By Robert Madole
-Copyright (c) Font Awesome
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/assets/fonts/fa-brands-400.ttf b/docs/assets/fonts/fa-brands-400.ttf
deleted file mode 100644
index 99163287..00000000
Binary files a/docs/assets/fonts/fa-brands-400.ttf and /dev/null differ
diff --git a/docs/assets/fonts/fa-brands-400.woff b/docs/assets/fonts/fa-brands-400.woff
deleted file mode 100644
index f9e3bcd0..00000000
Binary files a/docs/assets/fonts/fa-brands-400.woff and /dev/null differ
diff --git a/docs/assets/fonts/fa-brands-400.woff2 b/docs/assets/fonts/fa-brands-400.woff2
deleted file mode 100644
index 51c07aef..00000000
Binary files a/docs/assets/fonts/fa-brands-400.woff2 and /dev/null differ
diff --git a/docs/assets/fonts/fa-regular-400.eot b/docs/assets/fonts/fa-regular-400.eot
deleted file mode 100644
index 04e25cba..00000000
Binary files a/docs/assets/fonts/fa-regular-400.eot and /dev/null differ
diff --git a/docs/assets/fonts/fa-regular-400.svg b/docs/assets/fonts/fa-regular-400.svg
deleted file mode 100644
index f1f7e6cb..00000000
--- a/docs/assets/fonts/fa-regular-400.svg
+++ /dev/null
@@ -1,803 +0,0 @@
-
-
-
-
-
-Created by FontForge 20190801 at Tue Dec 10 16:09:21 2019
- By Robert Madole
-Copyright (c) Font Awesome
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/assets/fonts/fa-regular-400.ttf b/docs/assets/fonts/fa-regular-400.ttf
deleted file mode 100644
index 9c6249c0..00000000
Binary files a/docs/assets/fonts/fa-regular-400.ttf and /dev/null differ
diff --git a/docs/assets/fonts/fa-regular-400.woff b/docs/assets/fonts/fa-regular-400.woff
deleted file mode 100644
index 2873e438..00000000
Binary files a/docs/assets/fonts/fa-regular-400.woff and /dev/null differ
diff --git a/docs/assets/fonts/fa-regular-400.woff2 b/docs/assets/fonts/fa-regular-400.woff2
deleted file mode 100644
index a34bd652..00000000
Binary files a/docs/assets/fonts/fa-regular-400.woff2 and /dev/null differ
diff --git a/docs/assets/fonts/fa-solid-900.eot b/docs/assets/fonts/fa-solid-900.eot
deleted file mode 100644
index 39716a7b..00000000
Binary files a/docs/assets/fonts/fa-solid-900.eot and /dev/null differ
diff --git a/docs/assets/fonts/fa-solid-900.svg b/docs/assets/fonts/fa-solid-900.svg
deleted file mode 100644
index cfd0e2f4..00000000
--- a/docs/assets/fonts/fa-solid-900.svg
+++ /dev/null
@@ -1,4700 +0,0 @@
-
-
-
-
-
-Created by FontForge 20190801 at Tue Dec 10 16:09:21 2019
- By Robert Madole
-Copyright (c) Font Awesome
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/assets/fonts/fa-solid-900.ttf b/docs/assets/fonts/fa-solid-900.ttf
deleted file mode 100644
index ac4baa21..00000000
Binary files a/docs/assets/fonts/fa-solid-900.ttf and /dev/null differ
diff --git a/docs/assets/fonts/fa-solid-900.woff b/docs/assets/fonts/fa-solid-900.woff
deleted file mode 100644
index 23002f8a..00000000
Binary files a/docs/assets/fonts/fa-solid-900.woff and /dev/null differ
diff --git a/docs/assets/fonts/fa-solid-900.woff2 b/docs/assets/fonts/fa-solid-900.woff2
deleted file mode 100644
index b37f209d..00000000
Binary files a/docs/assets/fonts/fa-solid-900.woff2 and /dev/null differ
diff --git a/docs/assets/fonts/font-awesome.min.css b/docs/assets/fonts/font-awesome.min.css
deleted file mode 100644
index 540440ce..00000000
--- a/docs/assets/fonts/font-awesome.min.css
+++ /dev/null
@@ -1,4 +0,0 @@
-/*!
- * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/docs/assets/fonts/fontawesome-all.min.css b/docs/assets/fonts/fontawesome-all.min.css
deleted file mode 100644
index 27e7ddd2..00000000
--- a/docs/assets/fonts/fontawesome-all.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*!
- * Font Awesome Free 5.12.0 by @fontawesome - https://fontawesome.com
- * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
- */
-.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
\ No newline at end of file
diff --git a/docs/assets/fonts/fontawesome-webfont.eot b/docs/assets/fonts/fontawesome-webfont.eot
deleted file mode 100644
index e9f60ca9..00000000
Binary files a/docs/assets/fonts/fontawesome-webfont.eot and /dev/null differ
diff --git a/docs/assets/fonts/fontawesome-webfont.svg b/docs/assets/fonts/fontawesome-webfont.svg
deleted file mode 100644
index 855c845e..00000000
--- a/docs/assets/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,2671 +0,0 @@
-
-
-
-
-Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
- By ,,,
-Copyright Dave Gandy 2016. All rights reserved.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/assets/fonts/fontawesome-webfont.ttf b/docs/assets/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index 35acda2f..00000000
Binary files a/docs/assets/fonts/fontawesome-webfont.ttf and /dev/null differ
diff --git a/docs/assets/fonts/fontawesome-webfont.woff b/docs/assets/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 400014a4..00000000
Binary files a/docs/assets/fonts/fontawesome-webfont.woff and /dev/null differ
diff --git a/docs/assets/fonts/fontawesome-webfont.woff2 b/docs/assets/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index 4d13fc60..00000000
Binary files a/docs/assets/fonts/fontawesome-webfont.woff2 and /dev/null differ
diff --git a/docs/assets/fonts/fontawesome5-overrides.min.css b/docs/assets/fonts/fontawesome5-overrides.min.css
deleted file mode 100644
index 498a1042..00000000
--- a/docs/assets/fonts/fontawesome5-overrides.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.fab.fa-bitcoin:before{content:"\f379"}.far.fa-calendar:before,.fas.fa-calendar:before{content:"\f133"}.far.fa-clipboard:before,.fas.fa-clipboard:before{content:"\f328"}.fab.fa-facebook-f:before{content:"\f39e"}.fab.fa-google-plus:before{content:"\f2b3"}.fas.fa-hotel:before{content:"\f594"}.fab.fa-linkedin:before{content:"\f08c"}.fas.fa-reply:before{content:"\f3e5"}.fas.fa-thermometer:before{content:"\f491"}.fab.fa-vimeo:before{content:"\f40a"}.far.fa-window-close:before,.fas.fa-window-close:before{content:"\f410"}.fab.fa-youtube-square:before{content:"\f431"}
\ No newline at end of file
diff --git a/docs/assets/fonts/ionicons.eot b/docs/assets/fonts/ionicons.eot
deleted file mode 100644
index 92a3f20a..00000000
Binary files a/docs/assets/fonts/ionicons.eot and /dev/null differ
diff --git a/docs/assets/fonts/ionicons.min.css b/docs/assets/fonts/ionicons.min.css
deleted file mode 100644
index baba9e93..00000000
--- a/docs/assets/fonts/ionicons.min.css
+++ /dev/null
@@ -1,11 +0,0 @@
-@charset "UTF-8";/*!
- Ionicons, v2.0.0
- Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
- https://twitter.com/benjsperry https://twitter.com/ionicframework
- MIT License: https://github.com/driftyco/ionicons
-
- Android-style icons originally built by Google’s
- Material Design Icons: https://github.com/google/material-design-icons
- used under CC BY http://creativecommons.org/licenses/by/4.0/
- Modified icons to fit ionicon’s grid from original.
-*/@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.eot?v=2.0.0");src:url("../fonts/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"),url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"),url("../fonts/ionicons.woff?v=2.0.0") format("woff"),url("../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done:before,.ion-android-done-all:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite:before,.ion-android-favorite-outline:before,.ion-android-film:before,.ion-android-folder:before,.ion-android-folder-open:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone:before,.ion-android-microphone-off:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person:before,.ion-android-person-add:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove:before,.ion-android-remove-circle:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-share-alt:before,.ion-android-star:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace:before,.ion-backspace-outline:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox:before,.ion-chatbox-working:before,.ion-chatboxes:before,.ion-chatbubble:before,.ion-chatbubble-working:before,.ion-chatbubbles:before,.ion-checkmark:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close:before,.ion-close-circled:before,.ion-close-round:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code:before,.ion-code-download:before,.ion-code-working:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document:before,.ion-document-text:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-email-unread:before,.ion-erlenmeyer-flask:before,.ion-erlenmeyer-flask-bubbles:before,.ion-eye:before,.ion-eye-disabled:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash:before,.ion-flash-off:before,.ion-folder:before,.ion-fork:before,.ion-fork-repo:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-happy-outline:before,.ion-headphone:before,.ion-heart:before,.ion-heart-broken:before,.ion-help:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information:before,.ion-information-circled:before,.ion-ionic:before,.ion-ios-alarm:before,.ion-ios-alarm-outline:before,.ion-ios-albums:before,.ion-ios-albums-outline:before,.ion-ios-americanfootball:before,.ion-ios-americanfootball-outline:before,.ion-ios-analytics:before,.ion-ios-analytics-outline:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-at-outline:before,.ion-ios-barcode:before,.ion-ios-barcode-outline:before,.ion-ios-baseball:before,.ion-ios-baseball-outline:before,.ion-ios-basketball:before,.ion-ios-basketball-outline:before,.ion-ios-bell:before,.ion-ios-bell-outline:before,.ion-ios-body:before,.ion-ios-body-outline:before,.ion-ios-bolt:before,.ion-ios-bolt-outline:before,.ion-ios-book:before,.ion-ios-book-outline:before,.ion-ios-bookmarks:before,.ion-ios-bookmarks-outline:before,.ion-ios-box:before,.ion-ios-box-outline:before,.ion-ios-briefcase:before,.ion-ios-briefcase-outline:before,.ion-ios-browsers:before,.ion-ios-browsers-outline:before,.ion-ios-calculator:before,.ion-ios-calculator-outline:before,.ion-ios-calendar:before,.ion-ios-calendar-outline:before,.ion-ios-camera:before,.ion-ios-camera-outline:before,.ion-ios-cart:before,.ion-ios-cart-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatbubble:before,.ion-ios-chatbubble-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock:before,.ion-ios-clock-outline:before,.ion-ios-close:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-download:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-outline:before,.ion-ios-cog:before,.ion-ios-cog-outline:before,.ion-ios-color-filter:before,.ion-ios-color-filter-outline:before,.ion-ios-color-wand:before,.ion-ios-color-wand-outline:before,.ion-ios-compose:before,.ion-ios-compose-outline:before,.ion-ios-contact:before,.ion-ios-contact-outline:before,.ion-ios-copy:before,.ion-ios-copy-outline:before,.ion-ios-crop:before,.ion-ios-crop-strong:before,.ion-ios-download:before,.ion-ios-download-outline:before,.ion-ios-drag:before,.ion-ios-email:before,.ion-ios-email-outline:before,.ion-ios-eye:before,.ion-ios-eye-outline:before,.ion-ios-fastforward:before,.ion-ios-fastforward-outline:before,.ion-ios-filing:before,.ion-ios-filing-outline:before,.ion-ios-film:before,.ion-ios-film-outline:before,.ion-ios-flag:before,.ion-ios-flag-outline:before,.ion-ios-flame:before,.ion-ios-flame-outline:before,.ion-ios-flask:before,.ion-ios-flask-outline:before,.ion-ios-flower:before,.ion-ios-flower-outline:before,.ion-ios-folder:before,.ion-ios-folder-outline:before,.ion-ios-football:before,.ion-ios-football-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-b:before,.ion-ios-game-controller-b-outline:before,.ion-ios-gear:before,.ion-ios-gear-outline:before,.ion-ios-glasses:before,.ion-ios-glasses-outline:before,.ion-ios-grid-view:before,.ion-ios-grid-view-outline:before,.ion-ios-heart:before,.ion-ios-heart-outline:before,.ion-ios-help:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-home:before,.ion-ios-home-outline:before,.ion-ios-infinite:before,.ion-ios-infinite-outline:before,.ion-ios-information:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-ionic-outline:before,.ion-ios-keypad:before,.ion-ios-keypad-outline:before,.ion-ios-lightbulb:before,.ion-ios-lightbulb-outline:before,.ion-ios-list:before,.ion-ios-list-outline:before,.ion-ios-location:before,.ion-ios-location-outline:before,.ion-ios-locked:before,.ion-ios-locked-outline:before,.ion-ios-loop:before,.ion-ios-loop-strong:before,.ion-ios-medical:before,.ion-ios-medical-outline:before,.ion-ios-medkit:before,.ion-ios-medkit-outline:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-minus:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-monitor:before,.ion-ios-monitor-outline:before,.ion-ios-moon:before,.ion-ios-moon-outline:before,.ion-ios-more:before,.ion-ios-more-outline:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-navigate-outline:before,.ion-ios-nutrition:before,.ion-ios-nutrition-outline:before,.ion-ios-paper:before,.ion-ios-paper-outline:before,.ion-ios-paperplane:before,.ion-ios-paperplane-outline:before,.ion-ios-partlysunny:before,.ion-ios-partlysunny-outline:before,.ion-ios-pause:before,.ion-ios-pause-outline:before,.ion-ios-paw:before,.ion-ios-paw-outline:before,.ion-ios-people:before,.ion-ios-people-outline:before,.ion-ios-person:before,.ion-ios-person-outline:before,.ion-ios-personadd:before,.ion-ios-personadd-outline:before,.ion-ios-photos:before,.ion-ios-photos-outline:before,.ion-ios-pie:before,.ion-ios-pie-outline:before,.ion-ios-pint:before,.ion-ios-pint-outline:before,.ion-ios-play:before,.ion-ios-play-outline:before,.ion-ios-plus:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetags:before,.ion-ios-pricetags-outline:before,.ion-ios-printer:before,.ion-ios-printer-outline:before,.ion-ios-pulse:before,.ion-ios-pulse-strong:before,.ion-ios-rainy:before,.ion-ios-rainy-outline:before,.ion-ios-recording:before,.ion-ios-recording-outline:before,.ion-ios-redo:before,.ion-ios-redo-outline:before,.ion-ios-refresh:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-reload:before,.ion-ios-reverse-camera:before,.ion-ios-reverse-camera-outline:before,.ion-ios-rewind:before,.ion-ios-rewind-outline:before,.ion-ios-rose:before,.ion-ios-rose-outline:before,.ion-ios-search:before,.ion-ios-search-strong:before,.ion-ios-settings:before,.ion-ios-settings-strong:before,.ion-ios-shuffle:before,.ion-ios-shuffle-strong:before,.ion-ios-skipbackward:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipforward:before,.ion-ios-skipforward-outline:before,.ion-ios-snowy:before,.ion-ios-speedometer:before,.ion-ios-speedometer-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stopwatch:before,.ion-ios-stopwatch-outline:before,.ion-ios-sunny:before,.ion-ios-sunny-outline:before,.ion-ios-telephone:before,.ion-ios-telephone-outline:before,.ion-ios-tennisball:before,.ion-ios-tennisball-outline:before,.ion-ios-thunderstorm:before,.ion-ios-thunderstorm-outline:before,.ion-ios-time:before,.ion-ios-time-outline:before,.ion-ios-timer:before,.ion-ios-timer-outline:before,.ion-ios-toggle:before,.ion-ios-toggle-outline:before,.ion-ios-trash:before,.ion-ios-trash-outline:before,.ion-ios-undo:before,.ion-ios-undo-outline:before,.ion-ios-unlocked:before,.ion-ios-unlocked-outline:before,.ion-ios-upload:before,.ion-ios-upload-outline:before,.ion-ios-videocam:before,.ion-ios-videocam-outline:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass:before,.ion-ios-wineglass-outline:before,.ion-ios-world:before,.ion-ios-world-outline:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon:before,.ion-navicon-round:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person:before,.ion-person-add:before,.ion-person-stalker:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply:before,.ion-reply-all:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-sad-outline:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android:before,.ion-social-android-outline:before,.ion-social-angular:before,.ion-social-angular-outline:before,.ion-social-apple:before,.ion-social-apple-outline:before,.ion-social-bitcoin:before,.ion-social-bitcoin-outline:before,.ion-social-buffer:before,.ion-social-buffer-outline:before,.ion-social-chrome:before,.ion-social-chrome-outline:before,.ion-social-codepen:before,.ion-social-codepen-outline:before,.ion-social-css3:before,.ion-social-css3-outline:before,.ion-social-designernews:before,.ion-social-designernews-outline:before,.ion-social-dribbble:before,.ion-social-dribbble-outline:before,.ion-social-dropbox:before,.ion-social-dropbox-outline:before,.ion-social-euro:before,.ion-social-euro-outline:before,.ion-social-facebook:before,.ion-social-facebook-outline:before,.ion-social-foursquare:before,.ion-social-foursquare-outline:before,.ion-social-freebsd-devil:before,.ion-social-github:before,.ion-social-github-outline:before,.ion-social-google:before,.ion-social-google-outline:before,.ion-social-googleplus:before,.ion-social-googleplus-outline:before,.ion-social-hackernews:before,.ion-social-hackernews-outline:before,.ion-social-html5:before,.ion-social-html5-outline:before,.ion-social-instagram:before,.ion-social-instagram-outline:before,.ion-social-javascript:before,.ion-social-javascript-outline:before,.ion-social-linkedin:before,.ion-social-linkedin-outline:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest:before,.ion-social-pinterest-outline:before,.ion-social-python:before,.ion-social-reddit:before,.ion-social-reddit-outline:before,.ion-social-rss:before,.ion-social-rss-outline:before,.ion-social-sass:before,.ion-social-skype:before,.ion-social-skype-outline:before,.ion-social-snapchat:before,.ion-social-snapchat-outline:before,.ion-social-tumblr:before,.ion-social-tumblr-outline:before,.ion-social-tux:before,.ion-social-twitch:before,.ion-social-twitch-outline:before,.ion-social-twitter:before,.ion-social-twitter-outline:before,.ion-social-usd:before,.ion-social-usd-outline:before,.ion-social-vimeo:before,.ion-social-vimeo-outline:before,.ion-social-whatsapp:before,.ion-social-whatsapp-outline:before,.ion-social-windows:before,.ion-social-windows-outline:before,.ion-social-wordpress:before,.ion-social-wordpress-outline:before,.ion-social-yahoo:before,.ion-social-yahoo-outline:before,.ion-social-yen:before,.ion-social-yen-outline:before,.ion-social-youtube:before,.ion-social-youtube-outline:before,.ion-soup-can:before,.ion-soup-can-outline:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle:before,.ion-toggle-filled:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt:before,.ion-tshirt-outline:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-circle:before{content:"\f359"}.ion-android-alarm-clock:before{content:"\f35a"}.ion-android-alert:before{content:"\f35b"}.ion-android-apps:before{content:"\f35c"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down:before{content:"\f35d"}.ion-android-arrow-dropdown:before{content:"\f35f"}.ion-android-arrow-dropdown-circle:before{content:"\f35e"}.ion-android-arrow-dropleft:before{content:"\f361"}.ion-android-arrow-dropleft-circle:before{content:"\f360"}.ion-android-arrow-dropright:before{content:"\f363"}.ion-android-arrow-dropright-circle:before{content:"\f362"}.ion-android-arrow-dropup:before{content:"\f365"}.ion-android-arrow-dropup-circle:before{content:"\f364"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up:before{content:"\f366"}.ion-android-attach:before{content:"\f367"}.ion-android-bar:before{content:"\f368"}.ion-android-bicycle:before{content:"\f369"}.ion-android-boat:before{content:"\f36a"}.ion-android-bookmark:before{content:"\f36b"}.ion-android-bulb:before{content:"\f36c"}.ion-android-bus:before{content:"\f36d"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-cancel:before{content:"\f36e"}.ion-android-car:before{content:"\f36f"}.ion-android-cart:before{content:"\f370"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkbox:before{content:"\f374"}.ion-android-checkbox-blank:before{content:"\f371"}.ion-android-checkbox-outline:before{content:"\f373"}.ion-android-checkbox-outline-blank:before{content:"\f372"}.ion-android-checkmark-circle:before{content:"\f375"}.ion-android-clipboard:before{content:"\f376"}.ion-android-close:before{content:"\f2d7"}.ion-android-cloud:before{content:"\f37a"}.ion-android-cloud-circle:before{content:"\f377"}.ion-android-cloud-done:before{content:"\f378"}.ion-android-cloud-outline:before{content:"\f379"}.ion-android-color-palette:before{content:"\f37b"}.ion-android-compass:before{content:"\f37c"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-contract:before{content:"\f37d"}.ion-android-create:before{content:"\f37e"}.ion-android-delete:before{content:"\f37f"}.ion-android-desktop:before{content:"\f380"}.ion-android-document:before{content:"\f381"}.ion-android-done:before{content:"\f383"}.ion-android-done-all:before{content:"\f382"}.ion-android-download:before{content:"\f2dd"}.ion-android-drafts:before{content:"\f384"}.ion-android-exit:before{content:"\f385"}.ion-android-expand:before{content:"\f386"}.ion-android-favorite:before{content:"\f388"}.ion-android-favorite-outline:before{content:"\f387"}.ion-android-film:before{content:"\f389"}.ion-android-folder:before{content:"\f2e0"}.ion-android-folder-open:before{content:"\f38a"}.ion-android-funnel:before{content:"\f38b"}.ion-android-globe:before{content:"\f38c"}.ion-android-hand:before{content:"\f2e3"}.ion-android-hangout:before{content:"\f38d"}.ion-android-happy:before{content:"\f38e"}.ion-android-home:before{content:"\f38f"}.ion-android-image:before{content:"\f2e4"}.ion-android-laptop:before{content:"\f390"}.ion-android-list:before{content:"\f391"}.ion-android-locate:before{content:"\f2e9"}.ion-android-lock:before{content:"\f392"}.ion-android-mail:before{content:"\f2eb"}.ion-android-map:before{content:"\f393"}.ion-android-menu:before{content:"\f394"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-microphone-off:before{content:"\f395"}.ion-android-more-horizontal:before{content:"\f396"}.ion-android-more-vertical:before{content:"\f397"}.ion-android-navigate:before{content:"\f398"}.ion-android-notifications:before{content:"\f39b"}.ion-android-notifications-none:before{content:"\f399"}.ion-android-notifications-off:before{content:"\f39a"}.ion-android-open:before{content:"\f39c"}.ion-android-options:before{content:"\f39d"}.ion-android-people:before{content:"\f39e"}.ion-android-person:before{content:"\f3a0"}.ion-android-person-add:before{content:"\f39f"}.ion-android-phone-landscape:before{content:"\f3a1"}.ion-android-phone-portrait:before{content:"\f3a2"}.ion-android-pin:before{content:"\f3a3"}.ion-android-plane:before{content:"\f3a4"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-print:before{content:"\f3a5"}.ion-android-radio-button-off:before{content:"\f3a6"}.ion-android-radio-button-on:before{content:"\f3a7"}.ion-android-refresh:before{content:"\f3a8"}.ion-android-remove:before{content:"\f2f4"}.ion-android-remove-circle:before{content:"\f3a9"}.ion-android-restaurant:before{content:"\f3aa"}.ion-android-sad:before{content:"\f3ab"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-share-alt:before{content:"\f3ac"}.ion-android-star:before{content:"\f2fc"}.ion-android-star-half:before{content:"\f3ad"}.ion-android-star-outline:before{content:"\f3ae"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-subway:before{content:"\f3af"}.ion-android-sunny:before{content:"\f3b0"}.ion-android-sync:before{content:"\f3b1"}.ion-android-textsms:before{content:"\f3b2"}.ion-android-time:before{content:"\f3b3"}.ion-android-train:before{content:"\f3b4"}.ion-android-unlock:before{content:"\f3b5"}.ion-android-upload:before{content:"\f3b6"}.ion-android-volume-down:before{content:"\f3b7"}.ion-android-volume-mute:before{content:"\f3b8"}.ion-android-volume-off:before{content:"\f3b9"}.ion-android-volume-up:before{content:"\f3ba"}.ion-android-walk:before{content:"\f3bb"}.ion-android-warning:before{content:"\f3bc"}.ion-android-watch:before{content:"\f3bd"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-backspace:before{content:"\f3bf"}.ion-backspace-outline:before{content:"\f3be"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-bowtie:before{content:"\f3c0"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-crop:before{content:"\f3c1"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-easel:before{content:"\f3c2"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-email-unread:before{content:"\f3c3"}.ion-erlenmeyer-flask:before{content:"\f3c5"}.ion-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-happy-outline:before{content:"\f3c6"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-alarm-outline:before{content:"\f3c7"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-albums-outline:before{content:"\f3c9"}.ion-ios-americanfootball:before{content:"\f3cc"}.ion-ios-americanfootball-outline:before{content:"\f3cb"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-analytics-outline:before{content:"\f3cd"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-left:before{content:"\f3d2"}.ion-ios-arrow-right:before{content:"\f3d3"}.ion-ios-arrow-thin-down:before{content:"\f3d4"}.ion-ios-arrow-thin-left:before{content:"\f3d5"}.ion-ios-arrow-thin-right:before{content:"\f3d6"}.ion-ios-arrow-thin-up:before{content:"\f3d7"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-at-outline:before{content:"\f3d9"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-barcode-outline:before{content:"\f3db"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-baseball-outline:before{content:"\f3dd"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-basketball-outline:before{content:"\f3df"}.ion-ios-bell:before{content:"\f3e2"}.ion-ios-bell-outline:before{content:"\f3e1"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-body-outline:before{content:"\f3e3"}.ion-ios-bolt:before{content:"\f3e6"}.ion-ios-bolt-outline:before{content:"\f3e5"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-book-outline:before{content:"\f3e7"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bookmarks-outline:before{content:"\f3e9"}.ion-ios-box:before{content:"\f3ec"}.ion-ios-box-outline:before{content:"\f3eb"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-briefcase-outline:before{content:"\f3ed"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-browsers-outline:before{content:"\f3ef"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calculator-outline:before{content:"\f3f1"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-calendar-outline:before{content:"\f3f3"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-camera-outline:before{content:"\f3f5"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cart-outline:before{content:"\f3f7"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatboxes-outline:before{content:"\f3f9"}.ion-ios-chatbubble:before{content:"\f3fc"}.ion-ios-chatbubble-outline:before{content:"\f3fb"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-empty:before{content:"\f3fd"}.ion-ios-checkmark-outline:before{content:"\f3fe"}.ion-ios-circle-filled:before{content:"\f400"}.ion-ios-circle-outline:before{content:"\f401"}.ion-ios-clock:before{content:"\f403"}.ion-ios-clock-outline:before{content:"\f402"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-empty:before{content:"\f404"}.ion-ios-close-outline:before{content:"\f405"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-download-outline:before{content:"\f407"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloud-upload-outline:before{content:"\f40a"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-cloudy-night-outline:before{content:"\f40d"}.ion-ios-cloudy-outline:before{content:"\f40f"}.ion-ios-cog:before{content:"\f412"}.ion-ios-cog-outline:before{content:"\f411"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-filter-outline:before{content:"\f413"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-color-wand-outline:before{content:"\f415"}.ion-ios-compose:before{content:"\f418"}.ion-ios-compose-outline:before{content:"\f417"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contact-outline:before{content:"\f419"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-copy-outline:before{content:"\f41b"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-crop-strong:before{content:"\f41d"}.ion-ios-download:before{content:"\f420"}.ion-ios-download-outline:before{content:"\f41f"}.ion-ios-drag:before{content:"\f421"}.ion-ios-email:before{content:"\f423"}.ion-ios-email-outline:before{content:"\f422"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-outline:before{content:"\f424"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-fastforward-outline:before{content:"\f426"}.ion-ios-filing:before{content:"\f429"}.ion-ios-filing-outline:before{content:"\f428"}.ion-ios-film:before{content:"\f42b"}.ion-ios-film-outline:before{content:"\f42a"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flag-outline:before{content:"\f42c"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flame-outline:before{content:"\f42e"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flask-outline:before{content:"\f430"}.ion-ios-flower:before{content:"\f433"}.ion-ios-flower-outline:before{content:"\f432"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-outline:before{content:"\f434"}.ion-ios-football:before{content:"\f437"}.ion-ios-football-outline:before{content:"\f436"}.ion-ios-game-controller-a:before{content:"\f439"}.ion-ios-game-controller-a-outline:before{content:"\f438"}.ion-ios-game-controller-b:before{content:"\f43b"}.ion-ios-game-controller-b-outline:before{content:"\f43a"}.ion-ios-gear:before{content:"\f43d"}.ion-ios-gear-outline:before{content:"\f43c"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-glasses-outline:before{content:"\f43e"}.ion-ios-grid-view:before{content:"\f441"}.ion-ios-grid-view-outline:before{content:"\f440"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-outline:before{content:"\f442"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-empty:before{content:"\f444"}.ion-ios-help-outline:before{content:"\f445"}.ion-ios-home:before{content:"\f448"}.ion-ios-home-outline:before{content:"\f447"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-infinite-outline:before{content:"\f449"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-empty:before{content:"\f44b"}.ion-ios-information-outline:before{content:"\f44c"}.ion-ios-ionic-outline:before{content:"\f44e"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-keypad-outline:before{content:"\f44f"}.ion-ios-lightbulb:before{content:"\f452"}.ion-ios-lightbulb-outline:before{content:"\f451"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-outline:before{content:"\f453"}.ion-ios-location:before{content:"\f456"}.ion-ios-location-outline:before{content:"\f455"}.ion-ios-locked:before{content:"\f458"}.ion-ios-locked-outline:before{content:"\f457"}.ion-ios-loop:before{content:"\f45a"}.ion-ios-loop-strong:before{content:"\f459"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medical-outline:before{content:"\f45b"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-medkit-outline:before{content:"\f45d"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-mic-outline:before{content:"\f460"}.ion-ios-minus:before{content:"\f464"}.ion-ios-minus-empty:before{content:"\f462"}.ion-ios-minus-outline:before{content:"\f463"}.ion-ios-monitor:before{content:"\f466"}.ion-ios-monitor-outline:before{content:"\f465"}.ion-ios-moon:before{content:"\f468"}.ion-ios-moon-outline:before{content:"\f467"}.ion-ios-more:before{content:"\f46a"}.ion-ios-more-outline:before{content:"\f469"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-navigate-outline:before{content:"\f46d"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-nutrition-outline:before{content:"\f46f"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-outline:before{content:"\f471"}.ion-ios-paperplane:before{content:"\f474"}.ion-ios-paperplane-outline:before{content:"\f473"}.ion-ios-partlysunny:before{content:"\f476"}.ion-ios-partlysunny-outline:before{content:"\f475"}.ion-ios-pause:before{content:"\f478"}.ion-ios-pause-outline:before{content:"\f477"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-paw-outline:before{content:"\f479"}.ion-ios-people:before{content:"\f47c"}.ion-ios-people-outline:before{content:"\f47b"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-outline:before{content:"\f47d"}.ion-ios-personadd:before{content:"\f480"}.ion-ios-personadd-outline:before{content:"\f47f"}.ion-ios-photos:before{content:"\f482"}.ion-ios-photos-outline:before{content:"\f481"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pie-outline:before{content:"\f483"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pint-outline:before{content:"\f485"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-outline:before{content:"\f487"}.ion-ios-plus:before{content:"\f48b"}.ion-ios-plus-empty:before{content:"\f489"}.ion-ios-plus-outline:before{content:"\f48a"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetag-outline:before{content:"\f48c"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-pricetags-outline:before{content:"\f48e"}.ion-ios-printer:before{content:"\f491"}.ion-ios-printer-outline:before{content:"\f490"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-pulse-strong:before{content:"\f492"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-rainy-outline:before{content:"\f494"}.ion-ios-recording:before{content:"\f497"}.ion-ios-recording-outline:before{content:"\f496"}.ion-ios-redo:before{content:"\f499"}.ion-ios-redo-outline:before{content:"\f498"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-empty:before{content:"\f49a"}.ion-ios-refresh-outline:before{content:"\f49b"}.ion-ios-reload:before{content:"\f49d"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-reverse-camera-outline:before{content:"\f49e"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-rewind-outline:before{content:"\f4a0"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-rose-outline:before{content:"\f4a2"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-search-strong:before{content:"\f4a4"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-settings-strong:before{content:"\f4a6"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-shuffle-strong:before{content:"\f4a8"}.ion-ios-skipbackward:before{content:"\f4ab"}.ion-ios-skipbackward-outline:before{content:"\f4aa"}.ion-ios-skipforward:before{content:"\f4ad"}.ion-ios-skipforward-outline:before{content:"\f4ac"}.ion-ios-snowy:before{content:"\f4ae"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-speedometer-outline:before{content:"\f4af"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-stopwatch-outline:before{content:"\f4b4"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-sunny-outline:before{content:"\f4b6"}.ion-ios-telephone:before{content:"\f4b9"}.ion-ios-telephone-outline:before{content:"\f4b8"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-tennisball-outline:before{content:"\f4ba"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-thunderstorm-outline:before{content:"\f4bc"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-time-outline:before{content:"\f4be"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-timer-outline:before{content:"\f4c0"}.ion-ios-toggle:before{content:"\f4c3"}.ion-ios-toggle-outline:before{content:"\f4c2"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trash-outline:before{content:"\f4c4"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-undo-outline:before{content:"\f4c6"}.ion-ios-unlocked:before{content:"\f4c9"}.ion-ios-unlocked-outline:before{content:"\f4c8"}.ion-ios-upload:before{content:"\f4cb"}.ion-ios-upload-outline:before{content:"\f4ca"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-videocam-outline:before{content:"\f4cc"}.ion-ios-volume-high:before{content:"\f4ce"}.ion-ios-volume-low:before{content:"\f4cf"}.ion-ios-wineglass:before{content:"\f4d1"}.ion-ios-wineglass-outline:before{content:"\f4d0"}.ion-ios-world:before{content:"\f4d3"}.ion-ios-world-outline:before{content:"\f4d2"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before{content:"\f29a"}.ion-load-b:before{content:"\f29b"}.ion-load-c:before{content:"\f29c"}.ion-load-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-lock-combination:before{content:"\f4d4"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paintbrush:before{content:"\f4d5"}.ion-paintbucket:before{content:"\f4d6"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-sad-outline:before{content:"\f4d7"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-angular:before{content:"\f4d9"}.ion-social-angular-outline:before{content:"\f4d8"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-chrome:before{content:"\f4db"}.ion-social-chrome-outline:before{content:"\f4da"}.ion-social-codepen:before{content:"\f4dd"}.ion-social-codepen-outline:before{content:"\f4dc"}.ion-social-css3:before{content:"\f4df"}.ion-social-css3-outline:before{content:"\f4de"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-euro:before{content:"\f4e1"}.ion-social-euro-outline:before{content:"\f4e0"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-html5:before{content:"\f4e3"}.ion-social-html5-outline:before{content:"\f4e2"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-javascript:before{content:"\f4e5"}.ion-social-javascript-outline:before{content:"\f4e4"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-markdown:before{content:"\f4e6"}.ion-social-nodejs:before{content:"\f4e7"}.ion-social-octocat:before{content:"\f4e8"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-python:before{content:"\f4e9"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-sass:before{content:"\f4ea"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-snapchat:before{content:"\f4ec"}.ion-social-snapchat-outline:before{content:"\f4eb"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitch:before{content:"\f4ee"}.ion-social-twitch-outline:before{content:"\f4ed"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-whatsapp:before{content:"\f4f0"}.ion-social-whatsapp-outline:before{content:"\f4ef"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-yen:before{content:"\f4f2"}.ion-social-yen-outline:before{content:"\f4f1"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-soup-can:before{content:"\f4f4"}.ion-soup-can-outline:before{content:"\f4f3"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-transgender:before{content:"\f4f5"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-tshirt:before{content:"\f4f7"}.ion-tshirt-outline:before{content:"\f4f6"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"}
diff --git a/docs/assets/fonts/ionicons.svg b/docs/assets/fonts/ionicons.svg
deleted file mode 100644
index 49fc8f36..00000000
--- a/docs/assets/fonts/ionicons.svg
+++ /dev/null
@@ -1,2230 +0,0 @@
-
-
-
-
-
-Created by FontForge 20120731 at Thu Dec 4 09:51:48 2014
- By Adam Bradley
-Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/assets/fonts/ionicons.ttf b/docs/assets/fonts/ionicons.ttf
deleted file mode 100644
index c4e46324..00000000
Binary files a/docs/assets/fonts/ionicons.ttf and /dev/null differ
diff --git a/docs/assets/fonts/ionicons.woff b/docs/assets/fonts/ionicons.woff
deleted file mode 100644
index 5f3a14e0..00000000
Binary files a/docs/assets/fonts/ionicons.woff and /dev/null differ
diff --git a/docs/assets/img/RetroDeck Wallpaper.png b/docs/assets/img/RetroDeck Wallpaper.png
deleted file mode 100644
index c4458b8c..00000000
Binary files a/docs/assets/img/RetroDeck Wallpaper.png and /dev/null differ
diff --git a/docs/assets/img/icon_circle_16x16.png b/docs/assets/img/icon_circle_16x16.png
deleted file mode 100644
index 244350d9..00000000
Binary files a/docs/assets/img/icon_circle_16x16.png and /dev/null differ
diff --git a/docs/assets/img/icon_circle_1_32x32.png b/docs/assets/img/icon_circle_1_32x32.png
deleted file mode 100644
index ee50205e..00000000
Binary files a/docs/assets/img/icon_circle_1_32x32.png and /dev/null differ
diff --git a/docs/assets/img/icon_circle_2_180x180.png b/docs/assets/img/icon_circle_2_180x180.png
deleted file mode 100644
index bab446bb..00000000
Binary files a/docs/assets/img/icon_circle_2_180x180.png and /dev/null differ
diff --git a/docs/assets/img/icon_circle_3_192x192.png b/docs/assets/img/icon_circle_3_192x192.png
deleted file mode 100644
index d55c7e67..00000000
Binary files a/docs/assets/img/icon_circle_3_192x192.png and /dev/null differ
diff --git a/docs/assets/img/icon_circle_4_512x512.png b/docs/assets/img/icon_circle_4_512x512.png
deleted file mode 100644
index f06467a3..00000000
Binary files a/docs/assets/img/icon_circle_4_512x512.png and /dev/null differ
diff --git a/docs/assets/img/logo_stacked_esde.png b/docs/assets/img/logo_stacked_esde.png
deleted file mode 100644
index 9ba88276..00000000
Binary files a/docs/assets/img/logo_stacked_esde.png and /dev/null differ
diff --git a/docs/assets/img/logo_unstacked.svg b/docs/assets/img/logo_unstacked.svg
deleted file mode 100644
index 9de96f02..00000000
--- a/docs/assets/img/logo_unstacked.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/assets/img/rd-esde-logo.svg b/docs/assets/img/rd-esde-logo.svg
deleted file mode 100644
index e4b76a32..00000000
--- a/docs/assets/img/rd-esde-logo.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/assets/img/screen01.jpeg b/docs/assets/img/screen01.jpeg
deleted file mode 100644
index 8918a07e..00000000
Binary files a/docs/assets/img/screen01.jpeg and /dev/null differ
diff --git a/docs/assets/img/screen02.jpeg b/docs/assets/img/screen02.jpeg
deleted file mode 100644
index 9e2de1a4..00000000
Binary files a/docs/assets/img/screen02.jpeg and /dev/null differ
diff --git a/docs/assets/img/screen03.jpeg b/docs/assets/img/screen03.jpeg
deleted file mode 100644
index 980a8794..00000000
Binary files a/docs/assets/img/screen03.jpeg and /dev/null differ
diff --git a/docs/assets/img/screen04.jpeg b/docs/assets/img/screen04.jpeg
deleted file mode 100644
index db74ee0c..00000000
Binary files a/docs/assets/img/screen04.jpeg and /dev/null differ
diff --git a/docs/assets/img/screen05.jpeg b/docs/assets/img/screen05.jpeg
deleted file mode 100644
index 3ce14b43..00000000
Binary files a/docs/assets/img/screen05.jpeg and /dev/null differ
diff --git a/docs/assets/img/screen06.jpeg b/docs/assets/img/screen06.jpeg
deleted file mode 100644
index 4d2e52f1..00000000
Binary files a/docs/assets/img/screen06.jpeg and /dev/null differ
diff --git a/docs/assets/js/Lightbox-Gallery.js b/docs/assets/js/Lightbox-Gallery.js
deleted file mode 100644
index cce539fa..00000000
--- a/docs/assets/js/Lightbox-Gallery.js
+++ /dev/null
@@ -1,3 +0,0 @@
-if (document.querySelectorAll('[data-bss-baguettebox]').length > 0) {
- baguetteBox.run('[data-bss-baguettebox]', { animation: 'slideIn' });
-}
\ No newline at end of file
diff --git a/docs/assets/js/Simple-Slider.js b/docs/assets/js/Simple-Slider.js
deleted file mode 100644
index 49ae5d05..00000000
--- a/docs/assets/js/Simple-Slider.js
+++ /dev/null
@@ -1,19 +0,0 @@
-document.addEventListener("DOMContentLoaded", function() {
-
- // Initializing the swiper plugin for the slider.
- // Read more here: http://idangero.us/swiper/api/
-
- var mySwiper = new Swiper('.swiper-container', {
- loop: true,
- pagination: {
- el: '.swiper-pagination' ,
- clickable: true
- },
- paginationClickable: true,
- navigation: {
- nextEl: '.swiper-button-next',
- prevEl: '.swiper-button-prev'
- }
- });
-
-});
\ No newline at end of file
diff --git a/docs/assets/js/scroll.js b/docs/assets/js/scroll.js
deleted file mode 100644
index 3ae27e07..00000000
--- a/docs/assets/js/scroll.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//add smooth scrolling when clicking any anchor link
-document.querySelectorAll('a[href^="#"]').forEach(anchor => {
- anchor.addEventListener('click', function (e) {
- e.preventDefault();
- document.querySelector(this.getAttribute('href')).scrollIntoView({
- behavior: 'smooth'
- });
- });
-});
-// Go to Other Element Smoothly
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
deleted file mode 100644
index eaf0043b..00000000
--- a/docs/index.html
+++ /dev/null
@@ -1,230 +0,0 @@
-
-
-
-
-
-
- RetroDECK
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Toggle navigation
-
-
-
-
-
-
-
-
-
-
RetroDECK is a polished and beginner-friendly environment for playing your retro games on Steam Deck and Linux Desktop, available with just one click from the Discover app or wherever you get your flatpaks.
-
-
-
-
-
-
-
-
-
-
-
-
-
POWERED BY ES-DE & THE RETRODECK FRAMEWORK
-
Together with ES-DE, other software and RetroDECK's own Framework. We are trying to bring you the best all-in-one system out there.
-
-
-
-
-
-
-
-
-
-
designed for you
-
-
-
-
-
pickup and play
-
No configuration is needed to start. You provide the games and we provide the play.
-
-
-
quick resume
-
Quit your game and pick it up exactly where you left off.
-
-
-
rewind & fast forward
-
Go back in time and retry without having to restart your game or skip over that long conversation.
-
-
-
The Configurator
-
A super powerful multi-tool interface that allows you to have quick access to the advanced functions and tweak them to your desire.
-
-
-
Flatpak
-
Everything is contained within one application and not over your entire filesystem. Only one place to look and one place to backu.!
-
-
-
Use your system
-
With RetroDECK there is no need to replace your existing Linux / SteamOS to get a all-in-one retro gaming solution. Install it on what you already have.
-
-
-
Hotkey System
-
Features a in-depth global hotkey system with radial menus in addition to button combos via Steam Input.
-
-
-
cheats
-
Can't surpass THAT point? Don't want to farm? Enable cheats and play smoothly.
-
-
-
metadata & Images
-
From the ES-DE frontend you can pull information to your library to create a beautiful user experience from various sources, that fits your style.
-
-
-
Retro Achievements
-
Get rewarded while you play! RetroDECK tracks your progress and awards you when you go the extra mile.
-
-
-
-
-
-
-
-
-
-
Always evolving & Improving
-
The RetroDECK Team always have several things in the works, what follows is just a tiny selection. To stay up to date on latest RetroDECK news check the the Wiki and join the Discord.
-
-
-
-
-
-
-
-
-
-
Planned / In-progress Features
-
-
-
-
-
online gaming
-
Tools to make it easier to play with your friends online.
-
-
-
cloud saves and backup
-
RetroDECK will backup your progression and sync it across multiple devices.
-
-
-
Multi-User System
-
Use local RetroDECK users or bind Steam Deck users to your own saves and emulator configurations.
-
-
-
Configurator Godot Edition
-
The new controller friendly configurator with even more advanced tools.
-
-
-
Add seperate games to Steam
-
Tools for adding all your favorite games as seperate entries in Steam with the click of a button.
-
-
-
More Content
-
RetroDECK will support even more Emulators / Game Engines / Tools and Systems.
-
-
-
-
-
-
-
-
-
-
Support RetroDECK or the software we use
-
Help us keep the game preservation ecosystem alive and healthy.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/emu-configs/PCSX2/GS.ini b/emu-configs/PCSX2/GS.ini
index 93ca603a..59ad1298 100644
--- a/emu-configs/PCSX2/GS.ini
+++ b/emu-configs/PCSX2/GS.ini
@@ -38,18 +38,18 @@ UserHacks_CPU_FB_Conversion = 0
UserHacks_DisableDepthSupport = 0
UserHacks_DisablePartialInvalidation = 1
UserHacks_Disable_Safe_Features = 0
-UserHacks_HalfPixelOffset = 0
-UserHacks_Half_Bottom_Override = -1
-UserHacks_SkipDraw_End = 0
-UserHacks_SkipDraw_Start = 0
+UserHacks_HalfPixelOffset = 1
+UserHacks_Half_Bottom_Override = 1
+UserHacks_SkipDraw = 0
+UserHacks_SkipDraw_Offset = 0
UserHacks_TCOffsetX = 0
UserHacks_TCOffsetY = 0
UserHacks_TextureInsideRt = 0
UserHacks_TriFilter = 0
UserHacks_WildHack = 0
-UserHacks_align_sprite_X = 0
+UserHacks_align_sprite_X = 1
UserHacks_merge_pp_sprite = 0
-UserHacks_round_sprite_offset = 0
+UserHacks_round_sprite_offset = 2
aa1 = 1
accurate_blending_unit = 1
accurate_date = 1
@@ -58,7 +58,8 @@ capture_enabled = 0
capture_out_dir = /tmp/GS_Capture
capture_threads = 4
conservative_framebuffer = 1
-crc_hack_level = -1
+crc_hack_level = 4
+disable_hw_gl_draw = 0
disable_shader_cache = 0
dithering_ps2 = 2
dump = 0
@@ -70,8 +71,14 @@ interlace = 7
linear_present = 1
mipmap = 1
mipmap_hw = -1
+override_GL_ARB_clear_texture = -1
+override_GL_ARB_direct_state_access = -1
+override_GL_ARB_gpu_shader5 = -1
override_GL_ARB_shader_image_load_store = -1
override_GL_ARB_sparse_texture = -1
+override_GL_ARB_sparse_texture2 = -1
+override_GL_ARB_texture_barrier = -1
+override_geometry_shader = -1
paltex = 0
png_compression_level = 1
preload_frame_with_gs_data = 0
diff --git a/emu-configs/PCSX2/PCSX2.ini b/emu-configs/PCSX2/PCSX2.ini
index bd77bf0f..c818b225 100644
--- a/emu-configs/PCSX2/PCSX2.ini
+++ b/emu-configs/PCSX2/PCSX2.ini
@@ -1,11 +1,16 @@
[UI]
SettingsVersion = 1
-MainWindowGeometry = AdnQywADAAAAAAAAAAAAAAAAA7UAAAJ/AAAAAAAAAAAAAAO1AAACfwAAAAAAAAAABQAAAAAAAAAAAAAAA7UAAAJ/
-MainWindowState = AAAA/wAAAAD9AAAAAAAAA7YAAAJXAAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIAAAAAAP////8AAAAAAAAAAA==
+InhibitScreensaver = true
+MainWindowGeometry = AdnQywADAAAAAAaHAAADIQAACqAAAAXWAAAGhwAAAz0AAAqgAAAF1gAAAAAAAAAADwAAAAaHAAADPQAACqAAAAXW
+MainWindowState = AAAA/wAAAAD9AAAAAAAABBoAAAJxAAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIAAAAAAP////8AAAAAAAAAAA==
PauseOnFocusLoss = true
StartFullscreen = true
+StartPaused = false
ConfirmShutdown = false
-
+HideMouseCursor = true
+RenderToSeparateWindow = false
+HideMainWindowWhenRunning = false
+DisableWindowResize = false
[EmuCore]
CdvdVerboseReads = false
@@ -19,16 +24,18 @@ EnableNoInterlacingPatches = false
EnableRecordingTools = true
EnableGameFixes = true
SaveStateOnShutdown = false
+EnableDiscordPresence = true
+InhibitScreensaver = true
ConsoleToStdio = false
HostFs = false
-PatchBios = false
-PatchRegion =
BackupSavestate = true
SavestateZstdCompression = true
McdEnableEjection = true
McdFolderAutoManage = true
+WarnAboutUnsafeSettings = true
GzipIsoIndexTemplate = $(f).pindex.tmp
BlockDumpSaveDirectory =
+EnableFastBoot = true
[EmuCore/Speedhacks]
@@ -58,29 +65,34 @@ EnableIOP = true
EnableEECache = false
EnableVU0 = true
EnableVU1 = true
-vuOverflow = true
-vuExtraOverflow = false
-vuSignOverflow = false
-vuUnderflow = false
+EnableFastmem = true
+PauseOnTLBMiss = false
+vu0Overflow = true
+vu0ExtraOverflow = false
+vu0SignOverflow = false
+vu0Underflow = false
+vu1Overflow = true
+vu1ExtraOverflow = false
+vu1SignOverflow = false
+vu1Underflow = false
fpuOverflow = true
fpuExtraOverflow = false
fpuFullMode = false
-StackFrameChecks = false
-PreBlockCheckEE = false
-PreBlockCheckIOP = false
[EmuCore/GS]
VsyncQueueSize = 2
FrameLimitEnable = true
VsyncEnable = 0
-FramerateNTSC = 59.940000
-FrameratePAL = 50.000000
+FramerateNTSC = 59.94
+FrameratePAL = 50
SyncToHostRefreshRate = false
AspectRatio = Auto 4:3/3:2
FMVAspectRatioSwitch = Off
-Zoom = 100.000000
-StretchY = 100.000000
+ScreenshotSize = 0
+ScreenshotFormat = 0
+ScreenshotQuality = 50
+StretchY = 100
CropLeft = 0
CropTop = 0
CropRight = 0
@@ -90,13 +102,12 @@ disable_interlace_offset = false
pcrtc_offsets = false
pcrtc_overscan = false
IntegerScaling = false
-linear_present = true
UseDebugDevice = false
UseBlitSwapChain = false
disable_shader_cache = false
DisableDualSourceBlend = false
DisableFramebufferFetch = false
-ThreadedPresentation = false
+DisableThreadedPresentation = false
SkipDuplicateFrames = false
OsdShowMessages = true
OsdShowSpeed = false
@@ -106,26 +117,30 @@ OsdShowGPU = false
OsdShowResolution = false
OsdShowGSStats = false
OsdShowIndicators = true
-HWDisableReadbacks = false
-accurate_date = true
+OsdShowSettings = false
+OsdShowInputs = false
+OsdShowFrameTimes = false
+HWSpinGPUForReadbacks = false
+HWSpinCPUForReadbacks = false
paltex = false
autoflush_sw = true
preload_frame_with_gs_data = false
-wrap_gs_mem = false
mipmap = true
UserHacks = false
UserHacks_align_sprite_X = false
UserHacks_AutoFlush = false
UserHacks_CPU_FB_Conversion = false
+UserHacks_ReadTCOnClose = false
UserHacks_DisableDepthSupport = false
UserHacks_DisablePartialInvalidation = false
UserHacks_Disable_Safe_Features = false
UserHacks_merge_pp_sprite = false
UserHacks_WildHack = false
-UserHacks_TextureInsideRt = false
+UserHacks_TextureInsideRt = 0
+UserHacks_TargetPartialInvalidation = false
+UserHacks_EstimateTextureRegion = false
fxaa = false
ShadeBoost = false
-shaderfx = false
dump = false
save = false
savef = false
@@ -139,19 +154,28 @@ DumpPaletteTextures = true
LoadTextureReplacements = false
LoadTextureReplacementsAsync = true
PrecacheTextureReplacements = false
-deinterlace = 7
-OsdScale = 250
-Renderer = -1
+EnableVideoCapture = true
+EnableVideoCaptureParameters = false
+VideoCaptureAutoResolution = false
+EnableAudioCapture = true
+EnableAudioCaptureParameters = false
+linear_present_mode = 1
+deinterlace_mode = 0
+OsdScale = 100
+Renderer = 14
upscale_multiplier = 1
mipmap_hw = -1
accurate_blending_unit = 1
crc_hack_level = -1
filter = 2
texture_preloading = 2
-GSDumpCompression = 1
+GSDumpCompression = 2
+HWDownloadMode = 0
+CASMode = 0
+CASSharpness = 50
dithering_ps2 = 2
MaxAnisotropy = 0
-extrathreads = 2
+extrathreads = 3
extrathreads_height = 4
TVShader = 0
UserHacks_SkipDraw_Start = 0
@@ -162,17 +186,45 @@ UserHacks_round_sprite_offset = 0
UserHacks_TCOffsetX = 0
UserHacks_TCOffsetY = 0
UserHacks_CPUSpriteRenderBW = 0
-UserHacks_TriFilter = -1
+UserHacks_CPUCLUTRender = 0
+UserHacks_GPUTargetCLUTMode = 0
+TriFilter = -1
OverrideTextureBarriers = -1
OverrideGeometryShaders = -1
ShadeBoost_Brightness = 50
ShadeBoost_Contrast = 50
ShadeBoost_Saturation = 50
+png_compression_level = 1
saven = 0
savel = 5000
-Adapter =
-shaderfx_conf = shaders/GS_FX_Settings.ini
-shaderfx_glsl = shaders/GS.fx
+CaptureContainer = mp4
+VideoCaptureCodec =
+VideoCaptureParameters =
+AudioCaptureCodec =
+AudioCaptureParameters =
+VideoCaptureBitrate = 6000
+VideoCaptureWidth = 640
+VideoCaptureHeight = 480
+AudioCaptureBitrate = 160
+Adapter = (Default)
+HWDumpDirectory =
+SWDumpDirectory =
+
+[SPU2/Debug]
+Global_Enable = false
+Show_Messages = false
+Show_Messages_Key_On_Off = false
+Show_Messages_Voice_Off = false
+Show_Messages_DMA_Transfer = false
+Show_Messages_AutoDMA = false
+Show_Messages_Overruns = false
+Show_Messages_CacheStats = false
+Log_Register_Access = false
+Log_DMA_Transfers = false
+Log_WAVE_Output = false
+Dump_Info = false
+Dump_Memory = false
+Dump_Regs = false
[SPU2/Mixing]
@@ -190,7 +242,11 @@ VolumeAdjustLFE = 0.000000
[SPU2/Output]
OutputModule = cubeb
-Latency = 100
+BackendName =
+DeviceName =
+Latency = 60
+OutputLatency = 20
+OutputLatencyMinimal = false
SynchMode = 0
SpeakerConfiguration = 0
DplDecodingLevel = 0
@@ -199,7 +255,7 @@ DplDecodingLevel = 0
[DEV9/Eth]
EthEnable = false
EthApi = Unset
-EthDevice =
+EthDevice =
EthLogDNS = false
InterceptDHCP = false
PS2IP = 0.0.0.0
@@ -229,6 +285,7 @@ FpuMulHack = false
FpuNegDivHack = false
XgKickHack = false
EETimingHack = false
+InstantDMAHack = false
SoftwareRendererFMVHack = false
SkipMPEGHack = false
OPHFlagHack = false
@@ -241,6 +298,7 @@ IbitHack = false
VUSyncHack = false
VUOverflowHack = false
BlitInternalFPSHack = false
+FullVU0SyncHack = false
[EmuCore/Profiler]
@@ -266,15 +324,34 @@ Enabled = false
EE.bitset = 0
IOP.bitset = 0
+[USB1]
+Type = None
+
+
+[USB2]
+Type = None
+
+
+[Achievements]
+Enabled = false
+TestMode = false
+UnofficialTestMode = false
+RichPresence = true
+ChallengeMode = false
+Leaderboards = true
+Notifications = true
+SoundEffects = true
+PrimedIndicators = true
+
[Filenames]
-BIOS =
+BIOS =
[Framerate]
-NominalScalar = 1.000000
-TurboScalar = 2.000000
-SlomoScalar = 0.500000
+NominalScalar = 1
+TurboScalar = 2
+SlomoScalar = 0.5
[MemoryCards]
@@ -303,14 +380,18 @@ SaveStates = RETRODECKHOMEDIR/states/ps2/pcsx2
MemoryCards = RETRODECKHOMEDIR/saves/ps2/pcsx2/memcards
Logs = logs
Cheats = cheats
+Covers = covers
CheatsWS = cheats_ws
CheatsNI = cheats_ni
Cache = cache
Textures = textures
InputProfiles = inputprofiles
+Videos = videos
[InputSources]
+Keyboard = true
+Mouse = true
SDL = true
SDLControllerEnhancedMode = false
XInput = false
@@ -370,6 +451,7 @@ R1 = SDL-0/RightShoulder
R2 = SDL-0/+RightTrigger
L3 = SDL-0/LeftStick
R3 = SDL-0/RightStick
+Analog = SDL-0/Guide
LUp = SDL-0/-LeftY
LRight = SDL-0/+LeftX
LDown = SDL-0/+LeftY
@@ -383,12 +465,39 @@ LargeMotor = SDL-0/LargeMotor
[Pad2]
-Type = None
+Type = DualShock2
Deadzone = 0.000000
AxisScale = 1.330000
LargeMotorScale = 1.000000
SmallMotorScale = 1.000000
-PressureModifier = 0.500000
+PressureModifier = 0.300000
+Up = SDL-1/DPadUp
+Right = SDL-1/DPadRight
+Down = SDL-1/DPadDown
+Left = SDL-1/DPadLeft
+Triangle = SDL-1/Y
+Circle = SDL-1/B
+Cross = SDL-1/A
+Square = SDL-1/X
+Select = SDL-1/Back
+Start = SDL-1/Start
+L1 = SDL-1/LeftShoulder
+L2 = SDL-1/+LeftTrigger
+R1 = SDL-1/RightShoulder
+R2 = SDL-1/+RightTrigger
+L3 = SDL-1/LeftStick
+R3 = SDL-1/RightStick
+Analog = SDL-1/Guide
+LUp = SDL-1/-LeftY
+LRight = SDL-1/+LeftX
+LDown = SDL-1/+LeftY
+LLeft = SDL-1/-LeftX
+RUp = SDL-1/-RightY
+RRight = SDL-1/+RightX
+RDown = SDL-1/+RightY
+RLeft = SDL-1/-RightX
+LargeMotor = SDL-1/LargeMotor
+SmallMotor = SDL-1/SmallMotor
[Pad3]
@@ -452,6 +561,6 @@ RecursivePaths = RETRODECKHOMEDIR/roms/ps2
[Achievements]
Enabled = false
ChallengeMode = false
-Username =
-Token =
-LoginTimestamp =
+Username =
+Token =
+LoginTimestamp =
diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P1-Gyro.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P1-Gyro.xml
new file mode 100644
index 00000000..83531018
--- /dev/null
+++ b/emu-configs/cemu/controllerProfiles/SteamInput-P1-Gyro.xml
@@ -0,0 +1,142 @@
+
+
+ Wii U GamePad
+ SteamInput-P1-Gyro
+
+ DSUController
+ 0
+ Controller 1
+ true
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+ 127.0.0.1
+ 26760
+
+
+
+ SDLController
+ 0_03000000de280000ff11000001000000
+ Steam Virtual Gamepad
+ 0
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+
+ 24
+ 40
+
+
+ 23
+ 46
+
+
+ 22
+ 41
+
+
+ 21
+ 47
+
+
+ 20
+ 38
+
+
+ 19
+ 44
+
+
+ 18
+ 39
+
+
+ 17
+ 45
+
+
+ 16
+ 8
+
+
+ 15
+ 7
+
+
+ 14
+ 14
+
+
+ 13
+ 13
+
+
+ 12
+ 12
+
+
+ 11
+ 11
+
+
+ 10
+ 4
+
+
+ 9
+ 6
+
+
+ 8
+ 43
+
+
+ 7
+ 42
+
+
+ 6
+ 10
+
+
+ 5
+ 9
+
+
+ 4
+ 3
+
+
+ 3
+ 2
+
+
+ 2
+ 1
+
+
+ 1
+ 0
+
+
+
+
diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P1.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P1.xml
new file mode 100644
index 00000000..e62e1b06
--- /dev/null
+++ b/emu-configs/cemu/controllerProfiles/SteamInput-P1.xml
@@ -0,0 +1,121 @@
+
+
+ Wii U GamePad
+ SteamInput-P1
+
+ SDLController
+ 0_03000000de280000ff11000001000000
+ Steam Virtual Gamepad
+ 0
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+
+ 24
+ 40
+
+
+ 23
+ 46
+
+
+ 22
+ 41
+
+
+ 21
+ 47
+
+
+ 20
+ 38
+
+
+ 19
+ 44
+
+
+ 18
+ 39
+
+
+ 17
+ 45
+
+
+ 16
+ 8
+
+
+ 15
+ 7
+
+
+ 14
+ 14
+
+
+ 1
+ 0
+
+
+ 2
+ 1
+
+
+ 3
+ 2
+
+
+ 4
+ 3
+
+
+ 5
+ 9
+
+
+ 6
+ 10
+
+
+ 7
+ 42
+
+
+ 8
+ 43
+
+
+ 9
+ 6
+
+
+ 10
+ 4
+
+
+ 11
+ 11
+
+
+ 12
+ 12
+
+
+ 13
+ 13
+
+
+
+
diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P2.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P2.xml
new file mode 100644
index 00000000..2311676f
--- /dev/null
+++ b/emu-configs/cemu/controllerProfiles/SteamInput-P2.xml
@@ -0,0 +1,121 @@
+
+
+ Wii U Pro Controller
+ SteamInput-P2
+
+ SDLController
+ 1_03000000de280000ff11000001000000
+ Steam Virtual Gamepad
+ 0
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+
+ 25
+ 40
+
+
+ 24
+ 46
+
+
+ 23
+ 41
+
+
+ 22
+ 47
+
+
+ 21
+ 38
+
+
+ 20
+ 44
+
+
+ 19
+ 39
+
+
+ 18
+ 45
+
+
+ 17
+ 8
+
+
+ 16
+ 7
+
+
+ 15
+ 14
+
+
+ 14
+ 13
+
+
+ 13
+ 12
+
+
+ 12
+ 11
+
+
+ 10
+ 4
+
+
+ 9
+ 6
+
+
+ 8
+ 43
+
+
+ 7
+ 42
+
+
+ 6
+ 10
+
+
+ 5
+ 9
+
+
+ 4
+ 3
+
+
+ 3
+ 2
+
+
+ 2
+ 1
+
+
+ 1
+ 0
+
+
+
+
diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P3.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P3.xml
new file mode 100644
index 00000000..b79243d5
--- /dev/null
+++ b/emu-configs/cemu/controllerProfiles/SteamInput-P3.xml
@@ -0,0 +1,121 @@
+
+
+ Wii U Pro Controller
+ SteamInput-P3
+
+ SDLController
+ 2_03000000de280000ff11000001000000
+ Steam Virtual Gamepad
+ 0
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+
+ 13
+ 12
+
+
+ 14
+ 13
+
+
+ 15
+ 14
+
+
+ 16
+ 7
+
+
+ 17
+ 8
+
+
+ 18
+ 45
+
+
+ 19
+ 39
+
+
+ 20
+ 44
+
+
+ 21
+ 38
+
+
+ 22
+ 47
+
+
+ 23
+ 41
+
+
+ 1
+ 0
+
+
+ 2
+ 1
+
+
+ 3
+ 2
+
+
+ 4
+ 3
+
+
+ 5
+ 9
+
+
+ 6
+ 10
+
+
+ 7
+ 42
+
+
+ 8
+ 43
+
+
+ 9
+ 6
+
+
+ 10
+ 4
+
+
+ 12
+ 11
+
+
+ 25
+ 40
+
+
+ 24
+ 46
+
+
+
+
diff --git a/emu-configs/cemu/controllerProfiles/SteamInput-P4.xml b/emu-configs/cemu/controllerProfiles/SteamInput-P4.xml
new file mode 100644
index 00000000..ce184168
--- /dev/null
+++ b/emu-configs/cemu/controllerProfiles/SteamInput-P4.xml
@@ -0,0 +1,121 @@
+
+
+ Wii U Pro Controller
+ SteamInput-P4
+
+ SDLController
+ 3_03000000de280000ff11000001000000
+ Steam Virtual Gamepad
+ 0
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+
+ 13
+ 12
+
+
+ 14
+ 13
+
+
+ 15
+ 14
+
+
+ 16
+ 7
+
+
+ 17
+ 8
+
+
+ 18
+ 45
+
+
+ 19
+ 39
+
+
+ 20
+ 44
+
+
+ 21
+ 38
+
+
+ 22
+ 47
+
+
+ 23
+ 41
+
+
+ 1
+ 0
+
+
+ 2
+ 1
+
+
+ 3
+ 2
+
+
+ 4
+ 3
+
+
+ 5
+ 9
+
+
+ 6
+ 10
+
+
+ 7
+ 42
+
+
+ 8
+ 43
+
+
+ 9
+ 6
+
+
+ 10
+ 4
+
+
+ 12
+ 11
+
+
+ 25
+ 40
+
+
+ 24
+ 46
+
+
+
+
diff --git a/emu-configs/cemu/controllerProfiles/controller0.xml b/emu-configs/cemu/controllerProfiles/controller0.xml
index d39fbe71..e62e1b06 100644
--- a/emu-configs/cemu/controllerProfiles/controller0.xml
+++ b/emu-configs/cemu/controllerProfiles/controller0.xml
@@ -1,11 +1,12 @@
Wii U GamePad
+ SteamInput-P1
SDLController
- 0_030079f6de280000ff11000001000000
+ 0_03000000de280000ff11000001000000
Steam Virtual Gamepad
- 1
+ 0
0.25
1
@@ -65,19 +66,19 @@
1
- 1
-
-
- 2
0
+
+ 2
+ 1
+
3
- 3
+ 2
4
- 2
+ 3
5
diff --git a/emu-configs/cemu/controllerProfiles/controller1.xml b/emu-configs/cemu/controllerProfiles/controller1.xml
new file mode 100644
index 00000000..8cd44de7
--- /dev/null
+++ b/emu-configs/cemu/controllerProfiles/controller1.xml
@@ -0,0 +1,120 @@
+
+
+ Wii U Pro Controller
+ SteamInput-P2
+
+ SDLController
+ 1_03000000de280000ff11000001000000
+ Steam Virtual Gamepad
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+
+ 13
+ 12
+
+
+ 14
+ 13
+
+
+ 15
+ 14
+
+
+ 16
+ 7
+
+
+ 17
+ 8
+
+
+ 18
+ 45
+
+
+ 19
+ 39
+
+
+ 20
+ 44
+
+
+ 21
+ 38
+
+
+ 22
+ 47
+
+
+ 23
+ 41
+
+
+ 1
+ 0
+
+
+ 2
+ 1
+
+
+ 3
+ 2
+
+
+ 4
+ 3
+
+
+ 5
+ 9
+
+
+ 6
+ 10
+
+
+ 7
+ 42
+
+
+ 8
+ 43
+
+
+ 9
+ 6
+
+
+ 10
+ 4
+
+
+ 12
+ 11
+
+
+ 25
+ 40
+
+
+ 24
+ 46
+
+
+
+
diff --git a/emu-configs/cemu/controllerProfiles/controller2.xml b/emu-configs/cemu/controllerProfiles/controller2.xml
new file mode 100644
index 00000000..ed9033cf
--- /dev/null
+++ b/emu-configs/cemu/controllerProfiles/controller2.xml
@@ -0,0 +1,120 @@
+
+
+ Wii U Pro Controller
+ SteamInput-P3
+
+ SDLController
+ 2_03000000de280000ff11000001000000
+ Steam Virtual Gamepad
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+
+ 24
+ 46
+
+
+ 25
+ 40
+
+
+ 12
+ 11
+
+
+ 10
+ 4
+
+
+ 9
+ 6
+
+
+ 8
+ 43
+
+
+ 7
+ 42
+
+
+ 6
+ 10
+
+
+ 5
+ 9
+
+
+ 4
+ 3
+
+
+ 3
+ 2
+
+
+ 13
+ 12
+
+
+ 14
+ 13
+
+
+ 1
+ 0
+
+
+ 15
+ 14
+
+
+ 2
+ 1
+
+
+ 16
+ 7
+
+
+ 17
+ 8
+
+
+ 18
+ 45
+
+
+ 19
+ 39
+
+
+ 20
+ 44
+
+
+ 21
+ 38
+
+
+ 22
+ 47
+
+
+ 23
+ 41
+
+
+
+
diff --git a/emu-configs/cemu/controllerProfiles/controller3.xml b/emu-configs/cemu/controllerProfiles/controller3.xml
new file mode 100644
index 00000000..c2c639ad
--- /dev/null
+++ b/emu-configs/cemu/controllerProfiles/controller3.xml
@@ -0,0 +1,120 @@
+
+
+ Wii U Pro Controller
+ SteamInput-P4
+
+ SDLController
+ 3_03000000de280000ff11000001000000
+ Steam Virtual Gamepad
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+ 0.25
+ 1
+
+
+
+ 24
+ 46
+
+
+ 25
+ 40
+
+
+ 12
+ 11
+
+
+ 10
+ 4
+
+
+ 9
+ 6
+
+
+ 8
+ 43
+
+
+ 7
+ 42
+
+
+ 6
+ 10
+
+
+ 5
+ 9
+
+
+ 4
+ 3
+
+
+ 3
+ 2
+
+
+ 13
+ 12
+
+
+ 14
+ 13
+
+
+ 1
+ 0
+
+
+ 15
+ 14
+
+
+ 2
+ 1
+
+
+ 16
+ 7
+
+
+ 17
+ 8
+
+
+ 18
+ 45
+
+
+ 19
+ 39
+
+
+ 20
+ 44
+
+
+ 21
+ 38
+
+
+ 22
+ 47
+
+
+ 23
+ 41
+
+
+
+
diff --git a/emu-configs/cemu/settings.xml b/emu-configs/cemu/settings.xml
index af643efb..62a1e269 100644
--- a/emu-configs/cemu/settings.xml
+++ b/emu-configs/cemu/settings.xml
@@ -101,7 +101,7 @@
2147483649
false
- 0
+ 1
1
@@ -110,4 +110,4 @@
-
\ No newline at end of file
+
diff --git a/emu-configs/citra/qt-config.ini b/emu-configs/citra/qt-config.ini
index d67c1316..989f06ee 100644
--- a/emu-configs/citra/qt-config.ini
+++ b/emu-configs/citra/qt-config.ini
@@ -55,11 +55,13 @@ profiles\1\button_gpio14="code:80,engine:keyboard"
profiles\1\button_gpio14\default=true
profiles\1\button_home="code:66,engine:keyboard"
profiles\1\button_home\default=true
-profiles\1\button_l="button:4,engine:sdl,guid:030079f6de280000ff11000001000000,port:0"
+profiles\1\button_l="axis:2,direction:+,engine:sdl,guid:030079f6de280000ff11000001000000,port:0,threshold:0.5"
profiles\1\button_l\default=false
profiles\1\button_left="direction:left,engine:sdl,guid:030079f6de280000ff11000001000000,hat:0,port:0"
profiles\1\button_left\default=false
-profiles\1\button_r="button:5,engine:sdl,guid:030079f6de280000ff11000001000000,port:0"
+profiles\1\button_power="code:86,engine:keyboard"
+profiles\1\button_power\default=true
+profiles\1\button_r="axis:5,direction:+,engine:sdl,guid:030079f6de280000ff11000001000000,port:0,threshold:0.5"
profiles\1\button_r\default=false
profiles\1\button_right="direction:right,engine:sdl,guid:030079f6de280000ff11000001000000,hat:0,port:0"
profiles\1\button_right\default=false
@@ -73,16 +75,16 @@ profiles\1\button_x="button:2,engine:sdl,guid:030079f6de280000ff11000001000000,p
profiles\1\button_x\default=false
profiles\1\button_y="button:3,engine:sdl,guid:030079f6de280000ff11000001000000,port:0"
profiles\1\button_y\default=false
-profiles\1\button_zl="axis:2,direction:+,engine:sdl,guid:030079f6de280000ff11000001000000,port:0,threshold:0.5"
+profiles\1\button_zl="button:4,engine:sdl,guid:030079f6de280000ff11000001000000,port:0"
profiles\1\button_zl\default=false
-profiles\1\button_zr="axis:5,direction:+,engine:sdl,guid:030079f6de280000ff11000001000000,port:0,threshold:0.5"
+profiles\1\button_zr="button:5,engine:sdl,guid:030079f6de280000ff11000001000000,port:0"
profiles\1\button_zr\default=false
profiles\1\c_stick="axis_x:3,axis_y:4,deadzone:0.100000,engine:sdl,guid:030079f6de280000ff11000001000000,port:0"
profiles\1\c_stick\default=false
profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:030079f6de280000ff11000001000000,port:0"
profiles\1\circle_pad\default=false
-profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0"
-profiles\1\motion_device\default=true
+profiles\1\motion_device=engine:cemuhookudp
+profiles\1\motion_device\default=false
profiles\1\name=default
profiles\1\name\default=true
profiles\1\touch_device=engine:emu_window
@@ -202,7 +204,7 @@ LLE\SPI=false
LLE\SPI\default=true
LLE\SSL=false
LLE\SSL\default=true
-gdbstub_port=@Variant(\0\0\0\x85`q)
+gdbstub_port=24689
gdbstub_port\default=true
record_frame_times=false
renderer_debug=false
@@ -213,34 +215,34 @@ use_gdbstub\default=true
[Layout]
anaglyph_shader_name=dubois (builtin)
anaglyph_shader_name\default=true
-custom_bottom_bottom=@Variant(\0\0\0\x85\x1\xe0)
+custom_bottom_bottom=480
custom_bottom_bottom\default=true
-custom_bottom_left=@Variant(\0\0\0\x85\0()
+custom_bottom_left=40
custom_bottom_left\default=true
-custom_bottom_right=@Variant(\0\0\0\x85\x1h)
+custom_bottom_right=360
custom_bottom_right\default=true
-custom_bottom_top=@Variant(\0\0\0\x85\0\xf0)
+custom_bottom_top=240
custom_bottom_top\default=true
custom_layout=false
custom_layout\default=true
-custom_second_layer_opacity=@Variant(\0\0\0\x85\0\x64)
+custom_second_layer_opacity=100
custom_second_layer_opacity\default=true
-custom_top_bottom=@Variant(\0\0\0\x85\0\xf0)
+custom_top_bottom=240
custom_top_bottom\default=true
-custom_top_left=@Variant(\0\0\0\x85\0\0)
+custom_top_left=0
custom_top_left\default=true
-custom_top_right=@Variant(\0\0\0\x85\x1\x90)
+custom_top_right=400
custom_top_right\default=true
-custom_top_top=@Variant(\0\0\0\x85\0\0)
+custom_top_top=0
custom_top_top\default=true
factor_3d=0
factor_3d\default=true
filter_mode=true
filter_mode\default=true
-large_screen_proportion=@Variant(\0\0\0\x87@\x80\0\0)
+large_screen_proportion=4
large_screen_proportion\default=true
-layout_option=0
-layout_option\default=true
+layout_option=2
+layout_option\default=false
mono_render_option=0
mono_render_option\default=true
pp_shader_name=none (builtin)
@@ -253,6 +255,8 @@ upright_screen=false
upright_screen\default=true
[Miscellaneous]
+enable_gamemode=true
+enable_gamemode\default=true
log_filter=*:Info
log_filter\default=true
@@ -269,12 +273,13 @@ bg_red=0
bg_red\default=true
frame_limit=100
frame_limit\default=true
-graphics_api=1
-graphics_api\default=true
+frame_limit_alternate=500
+graphics_api=2
+graphics_api\default=false
physical_device=0
physical_device\default=true
-resolution_factor=1
-resolution_factor\default=true
+resolution_factor=2
+resolution_factor\default=false
shaders_accurate_mul=true
shaders_accurate_mul\default=true
spirv_shader_gen=true
@@ -283,6 +288,8 @@ texture_filter=0
texture_filter\default=true
texture_filter_name=Linear (Default)
texture_filter_name\default=false
+texture_sampling=0
+texture_sampling\default=true
use_disk_shader_cache=true
use_disk_shader_cache\default=true
use_hw_renderer=true
@@ -299,12 +306,18 @@ allow_plugin_loader=true
allow_plugin_loader\default=true
init_clock=0
init_clock\default=true
+init_ticks_override=@Variant(\0\0\0\x81\0\0\0\0\0\0\0\0)
+init_ticks_override\default=true
+init_ticks_type=0
+init_ticks_type\default=true
init_time=@Variant(\0\0\0\x84\0\0\0\0\x38m5\xbd)
init_time\default=true
init_time_offset=@Variant(\0\0\0\x81\0\0\0\0\0\0\0\0)
init_time_offset\default=true
is_new_3ds=true
is_new_3ds\default=true
+lle_applets=false
+lle_applets\default=true
plugin_loader=false
plugin_loader\default=true
region_value=-1
@@ -338,6 +351,14 @@ Multiplayer\ip\default=true
Multiplayer\ip_ban_list\size=0
Multiplayer\max_player=8
Multiplayer\max_player\default=true
+Multiplayer\multiplayer_filter_games_owned=false
+Multiplayer\multiplayer_filter_games_owned\default=true
+Multiplayer\multiplayer_filter_hide_empty=false
+Multiplayer\multiplayer_filter_hide_empty\default=true
+Multiplayer\multiplayer_filter_hide_full=false
+Multiplayer\multiplayer_filter_hide_full\default=true
+Multiplayer\multiplayer_filter_text=
+Multiplayer\multiplayer_filter_text\default=true
Multiplayer\nickname=
Multiplayer\nickname\default=true
Multiplayer\port=24872
@@ -381,6 +402,18 @@ Shortcuts\Main%20Window\Advance%20Frame\Context=1
Shortcuts\Main%20Window\Advance%20Frame\Context\default=false
Shortcuts\Main%20Window\Advance%20Frame\KeySeq=
Shortcuts\Main%20Window\Advance%20Frame\KeySeq\default=true
+Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context=1
+Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context\default=true
+Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq=Ctrl+M
+Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq\default=true
+Shortcuts\Main%20Window\Audio%20Volume%20Down\Context=1
+Shortcuts\Main%20Window\Audio%20Volume%20Down\Context\default=true
+Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq=
+Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq\default=true
+Shortcuts\Main%20Window\Audio%20Volume%20Up\Context=1
+Shortcuts\Main%20Window\Audio%20Volume%20Up\Context\default=true
+Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq=
+Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq\default=true
Shortcuts\Main%20Window\Capture%20Screenshot\Context=3
Shortcuts\Main%20Window\Capture%20Screenshot\Context\default=true
Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+X
@@ -400,7 +433,7 @@ Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq\default=false
Shortcuts\Main%20Window\Exit%20Citra\Context=1
Shortcuts\Main%20Window\Exit%20Citra\Context\default=true
Shortcuts\Main%20Window\Exit%20Citra\KeySeq=Ctrl+Q
-Shortcuts\Main%20Window\Exit%20Citra\KeySeq\default=false
+Shortcuts\Main%20Window\Exit%20Citra\KeySeq\default=true
Shortcuts\Main%20Window\Exit%20Fullscreen\Context=1
Shortcuts\Main%20Window\Exit%20Fullscreen\Context\default=true
Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq=Ctrl+O
@@ -429,6 +462,26 @@ Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context=1
Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context\default=true
Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq=Ctrl+A
Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq\default=false
+Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\Context=2
+Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\Context\default=true
+Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\KeySeq=Ctrl+B
+Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\KeySeq\default=true
+Shortcuts\Main%20Window\Multiplayer%20Create%20Room\Context=2
+Shortcuts\Main%20Window\Multiplayer%20Create%20Room\Context\default=true
+Shortcuts\Main%20Window\Multiplayer%20Create%20Room\KeySeq=Ctrl+N
+Shortcuts\Main%20Window\Multiplayer%20Create%20Room\KeySeq\default=true
+Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\Context=1
+Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\Context\default=false
+Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\KeySeq=
+Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\KeySeq\default=false
+Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\Context=2
+Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\Context\default=true
+Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\KeySeq=Ctrl+L
+Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\KeySeq\default=true
+Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\Context=2
+Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\Context\default=true
+Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\KeySeq=Ctrl+R
+Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\KeySeq\default=true
Shortcuts\Main%20Window\Mute%20Audio\Context=1
Shortcuts\Main%20Window\Mute%20Audio\Context\default=true
Shortcuts\Main%20Window\Mute%20Audio\KeySeq=
@@ -464,13 +517,13 @@ Shortcuts\Main%20Window\Toggle%203D\KeySeq\default=false
Shortcuts\Main%20Window\Toggle%20Custom%20Textures\Context=2
Shortcuts\Main%20Window\Toggle%20Custom%20Textures\Context\default=true
Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq=F7
-Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq\default=false
+Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq\default=true
Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context=1
-Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context\default=false
+Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context\default=true
Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq=
Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=false
Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context=1
-Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context\default=true
+Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context\default=false
Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq=
Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq\default=false
Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\Context=1
@@ -483,19 +536,19 @@ Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq=Ctrl+L
Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq\default=false
Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context=1
Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context\default=true
-Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq=
-Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=false
+Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq=Ctrl+S
+Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=true
Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context=1
Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context\default=false
Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq=
-Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq\default=true
-UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x5\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4 \0\0\0\x5\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x5\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0t\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64)
-UILayout\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x4\x1f\0\0\x1\x8f\0\0\0\0\0\0\0\0\0\0\x4\x1f\0\0\x1\x8f\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\0\0\0\x4\x1f\0\0\x1\x8f)
+Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq\default=false
+UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x5\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\0\0\0\0\x5\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x5\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\x6T\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64\0\0\0\0)
+UILayout\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\xd6\0\0\0\xb4\0\0\x4*\0\0\x2\x43\0\0\0\xd6\0\0\0\xb4\0\0\x4*\0\0\x2\x43\0\0\0\0\0\0\0\0\x5\0\0\0\0\xd6\0\0\0\xb4\0\0\x4*\0\0\x2\x43)
UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31)
-UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k)
+UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p)
UILayout\microProfileDialogVisible=false
UILayout\microProfileDialogVisible\default=true
-UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xaa\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x41\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xc3\0\xff\xff\xff\0\0\x4 \0\0\x1^\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0)
+UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa9\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x41\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xc2\0\xff\xff\xff\0\0\x5\0\0\0\x3 \0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0)
Updater\check_for_update_on_start=true
Updater\check_for_update_on_start\default=true
Updater\update_on_close=false
@@ -514,6 +567,8 @@ fullscreen=true
fullscreen\default=false
hideInactiveMouse=false
hideInactiveMouse\default=true
+muteWhenInBackground=false
+muteWhenInBackground\default=true
pauseWhenInBackground=false
pauseWhenInBackground\default=true
saveStateWarning=true
@@ -534,12 +589,12 @@ theme\default=false
[Utility]
async_custom_loading=true
async_custom_loading\default=true
-custom_textures=false
-custom_textures\default=true
+custom_textures=true
+custom_textures\default=false
dump_textures=false
dump_textures\default=true
-preload_textures=false
-preload_textures\default=true
+preload_textures=true
+preload_textures\default=false
[VideoDumping]
audio_bitrate=64000
@@ -563,5 +618,5 @@ citra_token=
citra_username=RetroDECK
enable_telemetry=false
enable_telemetry\default=false
-web_api_url=https://api.citra-emu.org
-web_api_url\default=true
\ No newline at end of file
+web_api_url=
+web_api_url\default=false
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard_simple.vdf
similarity index 92%
rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard.vdf
rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard_simple.vdf
index 7e6100aa..5246fe57 100755
--- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard.vdf
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_generic_standard_simple.vdf
@@ -913,7 +913,7 @@
{
"id" "19"
"mode" "radial_menu"
- "name" "Global Radial"
+ "name" "Simple Radial"
"description" ""
"inputs"
{
@@ -1105,7 +1105,7 @@
{
"bindings"
{
- "binding" "key_press F4, F4, RD-F4.png, "
+ "binding" "key_press F8, F8, RD-F8.png, "
}
"settings"
{
@@ -1118,66 +1118,6 @@
}
}
"touch_menu_button_10"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F5, F5, RD-F5.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_11"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F7, F7, RD-F7.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_12"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F8, F8, RD-F8.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_13"
{
"activators"
{
@@ -1197,7 +1137,7 @@
{
}
}
- "touch_menu_button_14"
+ "touch_menu_button_11"
{
"activators"
{
@@ -1218,7 +1158,7 @@
{
}
}
- "touch_menu_button_15"
+ "touch_menu_button_12"
{
"activators"
{
@@ -1239,7 +1179,7 @@
{
}
}
- "touch_menu_button_16"
+ "touch_menu_button_13"
{
"activators"
{
@@ -1260,7 +1200,7 @@
{
}
}
- "touch_menu_button_17"
+ "touch_menu_button_14"
{
"activators"
{
@@ -1281,7 +1221,7 @@
{
}
}
- "touch_menu_button_18"
+ "touch_menu_button_15"
{
"activators"
{
@@ -1302,7 +1242,7 @@
{
}
}
- "touch_menu_button_19"
+ "touch_menu_button_16"
{
"activators"
{
@@ -1323,10 +1263,230 @@
{
}
}
+ "touch_menu_button_17"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_18"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_19"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
- "settings"
+ }
+ "group"
+ {
+ "id" "7"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
{
- "touchmenu_button_fire_type" "0"
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button start, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_left, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_right, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
}
"group"
@@ -1362,7 +1522,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 0, RetroDECK - Set, , "
+ "binding" "controller_action CHANGE_PRESET 1 0 1, , "
}
}
"Full_Press"
@@ -1419,7 +1579,7 @@
{
"bindings"
{
- "binding" "xinput_button a, , "
+ "binding" "xinput_button y, , "
}
}
}
@@ -1428,103 +1588,6 @@
}
}
"button_back_right"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button x, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "7"
- "mode" "switches"
- "name" ""
- "description" ""
- "inputs"
- {
- "button_escape"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button start, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_menu"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button select, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "controller_action CHANGE_PRESET 2 0 0, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "left_bumper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button shoulder_left, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "right_bumper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button shoulder_right, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_back_left"
{
"activators"
{
@@ -1540,7 +1603,7 @@
{
}
}
- "button_back_right"
+ "button_back_left_upper"
{
"activators"
{
@@ -1556,6 +1619,38 @@
{
}
}
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
}
"preset"
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3.vdf
deleted file mode 100755
index d9eb5f66..00000000
--- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3.vdf
+++ /dev/null
@@ -1,1591 +0,0 @@
-"controller_mappings"
-{
- "version" "3"
- "revision" "93"
- "title" "RetroDECK: DualShock 3 v.1b"
- "description" "RetroDECK: PS3 - DualShock 3 - v.1b"
- "creator" ""
- "progenitor" ""
- "url" ""
- "export_type" ""
- "controller_type" "controller_ps3"
- "controller_caps" "1590271"
- "major_revision" "0"
- "minor_revision" "0"
- "Timestamp" "-925476208"
- "actions"
- {
- "Default"
- {
- "title" "RetroDECK - Set"
- "legacy_set" "1"
- }
- "Preset_1000001"
- {
- "title" "Global Hotkeys - Set"
- "legacy_set" "1"
- }
- }
- "action_layers"
- {
- }
- "group"
- {
- "id" "0"
- "mode" "four_buttons"
- "name" ""
- "description" ""
- "inputs"
- {
- "button_a"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button A, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_b"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button B, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_x"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button X, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_y"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button Y, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "1"
- "mode" "dpad"
- "name" ""
- "description" ""
- "inputs"
- {
- "dpad_north"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button dpad_up, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_south"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button dpad_down, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_east"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button dpad_right, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_west"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button dpad_left, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "2"
- "mode" "joystick_move"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button JOYSTICK_RIGHT, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "3"
- "mode" "joystick_move"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button JOYSTICK_LEFT, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "4"
- "mode" "trigger"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button TRIGGER_LEFT, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "output_trigger" "1"
- }
- }
- "group"
- {
- "id" "5"
- "mode" "trigger"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button TRIGGER_RIGHT, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "output_trigger" "2"
- }
- }
- "group"
- {
- "id" "6"
- "mode" "joystick_move"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button JOYSTICK_RIGHT, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "8"
- "mode" "joystick_move"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button JOYSTICK_RIGHT, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "9"
- "mode" "dpad"
- "name" ""
- "description" ""
- "inputs"
- {
- "dpad_north"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_UP, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_south"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_DOWN, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_east"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_RIGHT, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_west"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_LEFT, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "requires_click" "0"
- "haptic_intensity_override" "0"
- }
- }
- "group"
- {
- "id" "12"
- "mode" "joystick_move"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Swap Screens, , "
- "binding" "key_press TAB, Swap Screens, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "11"
- "mode" "four_buttons"
- "name" ""
- "description" ""
- "inputs"
- {
- "button_a"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Pause / Resume, , "
- "binding" "key_press P, Pause / Resume, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_b"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Take Screenshot, , "
- "binding" "key_press X, Take Screenshot, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_x"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Fullscreen Toggle, , "
- "binding" "key_press RETURN, Fullscreen Toggle, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_y"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Open Menu, , "
- "binding" "key_press M, Open Menu, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "13"
- "mode" "trigger"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Rewind, , "
- "binding" "key_press KEYPAD_DASH, Rewind, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "output_trigger" "1"
- }
- }
- "group"
- {
- "id" "14"
- "mode" "trigger"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Fast forward, , "
- "binding" "key_press KEYPAD_PLUS, Fast forward, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "output_trigger" "2"
- }
- }
- "group"
- {
- "id" "15"
- "mode" "joystick_move"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press ESCAPE, Escape, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "16"
- "mode" "dpad"
- "name" ""
- "description" ""
- "inputs"
- {
- "dpad_north"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Increase Emulation Speed, , "
- "binding" "key_press 1, Increase Emulation Speed, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_south"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Decrease Emulation Speed, , "
- "binding" "key_press 2, Decrease Emulation Speed, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_east"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Next State Slot, , "
- "binding" "key_press K, Next State Slot, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_west"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Previous State Slot, , "
- "binding" "key_press J, Previous State Slot, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "requires_click" "0"
- "haptic_intensity_override" "0"
- }
- }
- "group"
- {
- "id" "17"
- "mode" "joystick_mouse"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "mouse_button LEFT, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "output_joystick" "2"
- }
- }
- "group"
- {
- "id" "18"
- "mode" "dpad"
- "name" ""
- "description" ""
- "inputs"
- {
- "dpad_north"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Swap Screens, , "
- "binding" "key_press TAB, Swap Screens, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_south"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "controller_action SHOW_KEYBOARD, Show Keyboard, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_east"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press RETURN, Enter, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_west"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press ESCAPE, Escape, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "mouse_button RIGHT, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "requires_click" "0"
- }
- }
- "group"
- {
- "id" "10"
- "mode" "switches"
- "name" ""
- "description" ""
- "inputs"
- {
- "button_escape"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Quit Emulator, , "
- "binding" "key_press Q, Quit Emulator, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_menu"
- {
- "activators"
- {
- "release"
- {
- "bindings"
- {
- "binding" "controller_action CHANGE_PRESET 1 0 0, RetroDECK - Set, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button SELECT, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "left_bumper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Load State, , "
- "binding" "key_press A, Load State, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "right_bumper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Save State, , "
- "binding" "key_press S, Save State, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_back_left"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button a, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_back_right"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button x, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "7"
- "mode" "switches"
- "name" ""
- "description" ""
- "inputs"
- {
- "button_escape"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button start, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_menu"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button select, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "controller_action CHANGE_PRESET 2 0 0, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "left_bumper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button shoulder_left, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "right_bumper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button shoulder_right, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_back_left"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button a, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_back_right"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button x, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "19"
- "mode" "radial_menu"
- "name" "dial"
- "description" ""
- "inputs"
- {
- "touch_menu_button_0"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_1"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press ESCAPE, Escape, RD-ESC.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_2"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press RETURN, Enter, RD-Enter.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_3"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press TAB, Tab, RD-Tab.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_4"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Control, RD-ctrl.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_5"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press SPACE, Space, RD-space.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_6"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_7"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_ALT, Alt, RD-alt.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_8"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F1, F1, RD-F1.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_9"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F4, F4, RD-F4.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_10"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F5, F5, RD-F5.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_11"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F7, F7, RD-F7.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_12"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F8, F8, RD-F8.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_13"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F10, F10, RD-F10.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_14"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, "
- "binding" "key_press R, Restart / Reset, RD-system-reboot.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_15"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_ALT, Wii Sync Button, RD-notification-network-wireless.png, "
- "binding" "key_press W, Wii Sync Button, RD-notification-network-wireless.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_16"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Swap Dual - Screens, RD-system-switch-user.png, "
- "binding" "key_press TAB, Swap Dual - Screens, RD-system-switch-user.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_17"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
- "binding" "key_press L, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_18"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
- "binding" "key_press W, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_19"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Swap Disc, RD-application-x-iso.png, "
- "binding" "key_press D, Swap Disc, RD-application-x-iso.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "touchmenu_button_fire_type" "0"
- }
- }
- "preset"
- {
- "id" "0"
- "name" "Default"
- "group_source_bindings"
- {
- "7" "switch active"
- "0" "button_diamond active"
- "3" "joystick active"
- "4" "left_trigger active"
- "5" "right_trigger active"
- "8" "right_joystick active"
- "9" "dpad active"
- }
- }
- "preset"
- {
- "id" "1"
- "name" "Preset_1000001"
- "group_source_bindings"
- {
- "10" "switch active"
- "11" "button_diamond active"
- "12" "joystick inactive"
- "18" "joystick inactive"
- "19" "joystick active"
- "13" "left_trigger active"
- "14" "right_trigger active"
- "15" "right_joystick inactive"
- "17" "right_joystick active"
- "16" "dpad active"
- }
- }
- "settings"
- {
- "left_trackpad_mode" "0"
- "right_trackpad_mode" "0"
- }
-}
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3_simple.vdf
similarity index 86%
rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4.vdf
rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3_simple.vdf
index 479ce25d..13b4ffe0 100755
--- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4.vdf
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps3_dualshock3_simple.vdf
@@ -1,20 +1,20 @@
"controller_mappings"
{
"version" "3"
- "revision" "81"
- "title" "RetroDECK: DualShock 4 v.1b"
- "description" "RetroDECK: PS4 - DualShock 4 - v.1b"
+ "revision" "93"
+ "title" "RetroDECK: DualShock 3 v.1b"
+ "description" "RetroDECK: PS3 - DualShock 3 - v.1b"
"creator" ""
"progenitor" ""
"url" ""
"export_type" ""
- "controller_type" "controller_ps4"
- "controller_caps" ""
+ "controller_type" "controller_ps3"
+ "controller_caps" "1590271"
"major_revision" "0"
"minor_revision" "0"
- "Timestamp" "1079447734"
+ "Timestamp" "-925476208"
"actions"
- {
+ {
"Default"
{
"title" "RetroDECK - Set"
@@ -474,8 +474,8 @@
}
"group"
{
- "id" "10"
- "mode" "single_button"
+ "id" "12"
+ "mode" "joystick_move"
"name" ""
"description" ""
"inputs"
@@ -488,7 +488,12 @@
{
"bindings"
{
- "binding" "xinput_button START, , "
+ "binding" "key_press LEFT_CONTROL, Swap Screens, , "
+ "binding" "key_press TAB, Swap Screens, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
}
}
}
@@ -501,92 +506,6 @@
"group"
{
"id" "11"
- "mode" "single_button"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "mouse_button RIGHT, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "14"
- "mode" "absolute_mouse"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "mouse_button LEFT, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "15"
- "mode" "absolute_mouse"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "mouse_button RIGHT, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "19"
"mode" "four_buttons"
"name" ""
"description" ""
@@ -601,7 +520,7 @@
"bindings"
{
"binding" "key_press LEFT_CONTROL, Pause / Resume, , "
- "binding" "key_press A, Pause / Resume, , "
+ "binding" "key_press P, Pause / Resume, , "
}
}
}
@@ -618,7 +537,7 @@
"bindings"
{
"binding" "key_press LEFT_CONTROL, Take Screenshot, , "
- "binding" "key_press B, Take Screenshot, , "
+ "binding" "key_press X, Take Screenshot, , "
}
}
}
@@ -664,98 +583,7 @@
}
"group"
{
- "id" "20"
- "mode" "absolute_mouse"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "mouse_button RIGHT, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "21"
- "mode" "absolute_mouse"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "mouse_button LEFT, Left Click, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "22"
- "mode" "joystick_move"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Swap Screens, , "
- "binding" "key_press TAB, Swap Screens, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "23"
+ "id" "13"
"mode" "trigger"
"name" ""
"description" ""
@@ -790,7 +618,7 @@
}
"group"
{
- "id" "24"
+ "id" "14"
"mode" "trigger"
"name" ""
"description" ""
@@ -825,7 +653,7 @@
}
"group"
{
- "id" "25"
+ "id" "15"
"mode" "joystick_move"
"name" ""
"description" ""
@@ -851,7 +679,7 @@
}
"group"
{
- "id" "26"
+ "id" "16"
"mode" "dpad"
"name" ""
"description" ""
@@ -950,7 +778,7 @@
}
"group"
{
- "id" "29"
+ "id" "17"
"mode" "joystick_mouse"
"name" ""
"description" ""
@@ -964,7 +792,7 @@
{
"bindings"
{
- "binding" "mouse_button LEFT, Left Click, , "
+ "binding" "mouse_button LEFT, , "
}
}
}
@@ -980,7 +808,7 @@
}
"group"
{
- "id" "30"
+ "id" "18"
"mode" "dpad"
"name" ""
"description" ""
@@ -1059,7 +887,7 @@
{
"bindings"
{
- "binding" "mouse_button RIGHT, Right Click, , "
+ "binding" "mouse_button RIGHT, , "
}
}
}
@@ -1075,13 +903,13 @@
}
"group"
{
- "id" "33"
- "mode" "absolute_mouse"
+ "id" "10"
+ "mode" "switches"
"name" ""
"description" ""
"inputs"
{
- "click"
+ "button_escape"
{
"activators"
{
@@ -1089,11 +917,97 @@
{
"bindings"
{
- "binding" "mouse_button MIDDLE, , "
+ "binding" "key_press LEFT_CONTROL, Quit Emulator, , "
+ "binding" "key_press Q, Quit Emulator, , "
}
- "settings"
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
{
- "haptic_intensity" "1"
+ "binding" "controller_action CHANGE_PRESET 1 0 0, RetroDECK - Set, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Load State, , "
+ "binding" "key_press A, Load State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Save State, , "
+ "binding" "key_press S, Save State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
}
}
}
@@ -1105,13 +1019,13 @@
}
"group"
{
- "id" "35"
- "mode" "absolute_mouse"
+ "id" "7"
+ "mode" "switches"
"name" ""
"description" ""
"inputs"
{
- "click"
+ "button_escape"
{
"activators"
{
@@ -1119,11 +1033,94 @@
{
"bindings"
{
- "binding" "mouse_button MIDDLE, , "
+ "binding" "xinput_button start, , "
}
- "settings"
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
{
- "haptic_intensity" "1"
+ "binding" "xinput_button select, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_left, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_right, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
}
}
}
@@ -1135,9 +1132,9 @@
}
"group"
{
- "id" "37"
+ "id" "19"
"mode" "radial_menu"
- "name" "Global Radial"
+ "name" "Simple Radial"
"description" ""
"inputs"
{
@@ -1329,7 +1326,7 @@
{
"bindings"
{
- "binding" "key_press F4, F4, RD-F4.png, "
+ "binding" "key_press F8, F8, RD-F8.png, "
}
"settings"
{
@@ -1342,66 +1339,6 @@
}
}
"touch_menu_button_10"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F5, F5, RD-F5.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_11"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F7, F7, RD-F7.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_12"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F8, F8, RD-F8.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_13"
{
"activators"
{
@@ -1421,7 +1358,7 @@
{
}
}
- "touch_menu_button_14"
+ "touch_menu_button_11"
{
"activators"
{
@@ -1442,7 +1379,7 @@
{
}
}
- "touch_menu_button_15"
+ "touch_menu_button_12"
{
"activators"
{
@@ -1463,7 +1400,7 @@
{
}
}
- "touch_menu_button_16"
+ "touch_menu_button_13"
{
"activators"
{
@@ -1484,7 +1421,7 @@
{
}
}
- "touch_menu_button_17"
+ "touch_menu_button_14"
{
"activators"
{
@@ -1505,7 +1442,7 @@
{
}
}
- "touch_menu_button_18"
+ "touch_menu_button_15"
{
"activators"
{
@@ -1526,7 +1463,7 @@
{
}
}
- "touch_menu_button_19"
+ "touch_menu_button_16"
{
"activators"
{
@@ -1547,21 +1484,7 @@
{
}
}
- }
- "settings"
- {
- "touchmenu_button_fire_type" "0"
- }
- }
- "group"
- {
- "id" "38"
- "mode" "single_button"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
+ "touch_menu_button_17"
{
"activators"
{
@@ -1569,11 +1492,12 @@
{
"bindings"
{
- "binding" "mouse_button RIGHT, Right Click, , "
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
}
"settings"
{
- "haptic_intensity" "0"
+ "haptic_intensity" "2"
}
}
}
@@ -1581,17 +1505,7 @@
{
}
}
- }
- }
- "group"
- {
- "id" "39"
- "mode" "single_button"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
+ "touch_menu_button_18"
{
"activators"
{
@@ -1599,11 +1513,12 @@
{
"bindings"
{
- "binding" "mouse_button MIDDLE, Middle Click, , "
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
}
"settings"
{
- "haptic_intensity" "0"
+ "haptic_intensity" "2"
}
}
}
@@ -1611,48 +1526,7 @@
{
}
}
- }
- "gameactions"
- {
- }
- }
- "group"
- {
- "id" "41"
- "mode" "dpad"
- "name" ""
- "description" ""
- "inputs"
- {
- }
- "settings"
- {
- "requires_click" "0"
- }
- }
- "group"
- {
- "id" "42"
- "mode" "dpad"
- "name" ""
- "description" ""
- "inputs"
- {
- }
- "settings"
- {
- "requires_click" "0"
- }
- }
- "group"
- {
- "id" "43"
- "mode" "single_button"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
+ "touch_menu_button_19"
{
"activators"
{
@@ -1660,7 +1534,12 @@
{
"bindings"
{
- "binding" "mouse_button MIDDLE, , "
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
}
}
}
@@ -1757,7 +1636,7 @@
{
"bindings"
{
- "binding" "xinput_button a, , "
+ "binding" "xinput_button y, , "
}
}
}
@@ -1766,6 +1645,22 @@
}
}
"button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
{
"activators"
{
@@ -1781,11 +1676,43 @@
{
}
}
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
}
"group"
{
- "id" "18"
+ "id" "10"
"mode" "switches"
"name" ""
"description" ""
@@ -1873,7 +1800,7 @@
{
"bindings"
{
- "binding" "xinput_button a, , "
+ "binding" "xinput_button y, , "
}
}
}
@@ -1882,6 +1809,22 @@
}
}
"button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
{
"activators"
{
@@ -1897,6 +1840,38 @@
{
}
}
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
}
"preset"
@@ -1907,21 +1882,11 @@
{
"7" "switch active"
"0" "button_diamond active"
- "1" "left_trackpad inactive"
- "11" "left_trackpad active"
- "15" "left_trackpad inactive"
- "2" "right_trackpad inactive"
- "6" "right_trackpad inactive"
- "10" "right_trackpad inactive"
- "14" "right_trackpad active"
"3" "joystick active"
"4" "left_trigger active"
"5" "right_trigger active"
"8" "right_joystick active"
"9" "dpad active"
- "35" "center_trackpad inactive"
- "43" "center_trackpad inactive"
- "41" "gyro active"
}
}
"preset"
@@ -1930,22 +1895,16 @@
"name" "Preset_1000001"
"group_source_bindings"
{
- "18" "switch active"
- "19" "button_diamond active"
- "20" "left_trackpad inactive"
- "38" "left_trackpad active"
- "21" "right_trackpad active"
- "22" "joystick inactive"
- "30" "joystick inactive"
- "37" "joystick active"
- "23" "left_trigger active"
- "24" "right_trigger active"
- "25" "right_joystick inactive"
- "29" "right_joystick active"
- "26" "dpad active"
- "33" "center_trackpad inactive"
- "39" "center_trackpad inactive"
- "42" "gyro active"
+ "10" "switch active"
+ "11" "button_diamond active"
+ "12" "joystick inactive"
+ "18" "joystick inactive"
+ "19" "joystick active"
+ "13" "left_trigger active"
+ "14" "right_trigger active"
+ "15" "right_joystick inactive"
+ "17" "right_joystick active"
+ "16" "dpad active"
}
}
"settings"
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4_simple.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4_simple.vdf
new file mode 100755
index 00000000..f440bed0
--- /dev/null
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps4_dualshock4_simple.vdf
@@ -0,0 +1,2280 @@
+"controller_mappings"
+{
+ "version" "3"
+ "revision" "81"
+ "title" "RetroDECK: DualShock 4 v.1b"
+ "description" "RetroDECK: PS4 - DualShock 4 - v.1b"
+ "creator" ""
+ "progenitor" ""
+ "url" ""
+ "export_type" ""
+ "controller_type" "controller_ps4"
+ "controller_caps" ""
+ "major_revision" "0"
+ "minor_revision" "0"
+ "Timestamp" "1079447734"
+ "actions"
+ {
+ "Default"
+ {
+ "title" "RetroDECK - Set"
+ "legacy_set" "1"
+ }
+ "Preset_1000001"
+ {
+ "title" "Global Hotkeys - Set"
+ "legacy_set" "1"
+ }
+ }
+ "action_layers"
+ {
+ }
+ "group"
+ {
+ "id" "0"
+ "mode" "four_buttons"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_a"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button A, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_b"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button B, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_x"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button X, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_y"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button Y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "1"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button dpad_up, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button dpad_down, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button dpad_right, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button dpad_left, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "2"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "3"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "4"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button TRIGGER_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "1"
+ }
+ }
+ "group"
+ {
+ "id" "5"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button TRIGGER_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "2"
+ }
+ }
+ "group"
+ {
+ "id" "6"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "8"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_RIGHT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "9"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_UP, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_DOWN, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ "haptic_intensity_override" "0"
+ }
+ }
+ "group"
+ {
+ "id" "10"
+ "mode" "single_button"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button START, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "11"
+ "mode" "single_button"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button RIGHT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "14"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "15"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "19"
+ "mode" "four_buttons"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_a"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Pause / Resume, , "
+ "binding" "key_press A, Pause / Resume, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_b"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Take Screenshot, , "
+ "binding" "key_press B, Take Screenshot, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_x"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Fullscreen Toggle, , "
+ "binding" "key_press RETURN, Fullscreen Toggle, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_y"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Open Menu, , "
+ "binding" "key_press M, Open Menu, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "20"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "21"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button LEFT, Left Click, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "22"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Swap Screens, , "
+ "binding" "key_press TAB, Swap Screens, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "23"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Rewind, , "
+ "binding" "key_press KEYPAD_DASH, Rewind, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "1"
+ }
+ }
+ "group"
+ {
+ "id" "24"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Fast forward, , "
+ "binding" "key_press KEYPAD_PLUS, Fast forward, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "2"
+ }
+ }
+ "group"
+ {
+ "id" "25"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press ESCAPE, Escape, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "26"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Increase Emulation Speed, , "
+ "binding" "key_press 1, Increase Emulation Speed, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Decrease Emulation Speed, , "
+ "binding" "key_press 2, Decrease Emulation Speed, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Next State Slot, , "
+ "binding" "key_press K, Next State Slot, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Previous State Slot, , "
+ "binding" "key_press J, Previous State Slot, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ "haptic_intensity_override" "0"
+ }
+ }
+ "group"
+ {
+ "id" "29"
+ "mode" "joystick_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button LEFT, Left Click, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_joystick" "2"
+ }
+ }
+ "group"
+ {
+ "id" "30"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Swap Screens, , "
+ "binding" "key_press TAB, Swap Screens, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SHOW_KEYBOARD, Show Keyboard, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press RETURN, Enter, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press ESCAPE, Escape, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button RIGHT, Right Click, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "33"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button MIDDLE, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "35"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button MIDDLE, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "37"
+ "mode" "radial_menu"
+ "name" "Simple Radial"
+ "description" ""
+ "inputs"
+ {
+ "touch_menu_button_0"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_1"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press ESCAPE, Escape, RD-ESC.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_2"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press RETURN, Enter, RD-Enter.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_3"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press TAB, Tab, RD-Tab.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_4"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Control, RD-ctrl.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_5"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press SPACE, Space, RD-space.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_6"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_7"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Alt, RD-alt.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_8"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F1, F1, RD-F1.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_9"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F8, F8, RD-F8.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_10"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F10, F10, RD-F10.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_11"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, "
+ "binding" "key_press R, Restart / Reset, RD-system-reboot.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_12"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wii Sync Button, RD-notification-network-wireless.png, "
+ "binding" "key_press W, Wii Sync Button, RD-notification-network-wireless.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_13"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Swap Dual - Screens, RD-system-switch-user.png, "
+ "binding" "key_press TAB, Swap Dual - Screens, RD-system-switch-user.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_14"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
+ "binding" "key_press L, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_15"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
+ "binding" "key_press W, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_16"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Swap Disc, RD-application-x-iso.png, "
+ "binding" "key_press D, Swap Disc, RD-application-x-iso.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_17"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_18"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_19"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "7"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button start, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_left, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_right, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "10"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Quit Emulator, , "
+ "binding" "key_press Q, Quit Emulator, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 1 0 1, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Load State, , "
+ "binding" "key_press A, Load State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Save State, , "
+ "binding" "key_press S, Save State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "38"
+ "mode" "single_button"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button RIGHT, Right Click, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "0"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "39"
+ "mode" "single_button"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button MIDDLE, Middle Click, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "0"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "gameactions"
+ {
+ }
+ }
+ "group"
+ {
+ "id" "41"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "42"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "43"
+ "mode" "single_button"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button MIDDLE, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "7"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button start, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_left, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_right, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "18"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Quit Emulator, , "
+ "binding" "key_press Q, Quit Emulator, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 1 0 1, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Load State, , "
+ "binding" "key_press A, Load State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Save State, , "
+ "binding" "key_press S, Save State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "preset"
+ {
+ "id" "0"
+ "name" "Default"
+ "group_source_bindings"
+ {
+ "7" "switch active"
+ "0" "button_diamond active"
+ "1" "left_trackpad inactive"
+ "11" "left_trackpad active"
+ "15" "left_trackpad inactive"
+ "2" "right_trackpad inactive"
+ "6" "right_trackpad inactive"
+ "10" "right_trackpad inactive"
+ "14" "right_trackpad active"
+ "3" "joystick active"
+ "4" "left_trigger active"
+ "5" "right_trigger active"
+ "8" "right_joystick active"
+ "9" "dpad active"
+ "35" "center_trackpad inactive"
+ "43" "center_trackpad inactive"
+ "41" "gyro active"
+ }
+ }
+ "preset"
+ {
+ "id" "1"
+ "name" "Preset_1000001"
+ "group_source_bindings"
+ {
+ "18" "switch active"
+ "19" "button_diamond active"
+ "20" "left_trackpad inactive"
+ "38" "left_trackpad active"
+ "21" "right_trackpad active"
+ "22" "joystick inactive"
+ "30" "joystick inactive"
+ "37" "joystick active"
+ "23" "left_trigger active"
+ "24" "right_trigger active"
+ "25" "right_joystick inactive"
+ "29" "right_joystick active"
+ "26" "dpad active"
+ "33" "center_trackpad inactive"
+ "39" "center_trackpad inactive"
+ "42" "gyro active"
+ }
+ }
+ "settings"
+ {
+ "left_trackpad_mode" "0"
+ "right_trackpad_mode" "0"
+ }
+}
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense_simple.vdf
similarity index 85%
rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense.vdf
rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense_simple.vdf
index 58797a73..634b532b 100755
--- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense.vdf
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_ps5_dualsense_simple.vdf
@@ -1137,7 +1137,7 @@
{
"id" "45"
"mode" "radial_menu"
- "name" "Global Radial"
+ "name" "Simple Radial"
"description" ""
"inputs"
{
@@ -1329,7 +1329,7 @@
{
"bindings"
{
- "binding" "key_press F4, F4, RD-F4.png, "
+ "binding" "key_press F8, F8, RD-F8.png, "
}
"settings"
{
@@ -1342,66 +1342,6 @@
}
}
"touch_menu_button_10"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F5, F5, RD-F5.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_11"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F7, F7, RD-F7.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_12"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F8, F8, RD-F8.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_13"
{
"activators"
{
@@ -1421,7 +1361,7 @@
{
}
}
- "touch_menu_button_14"
+ "touch_menu_button_11"
{
"activators"
{
@@ -1442,7 +1382,7 @@
{
}
}
- "touch_menu_button_15"
+ "touch_menu_button_12"
{
"activators"
{
@@ -1463,7 +1403,7 @@
{
}
}
- "touch_menu_button_16"
+ "touch_menu_button_13"
{
"activators"
{
@@ -1484,7 +1424,7 @@
{
}
}
- "touch_menu_button_17"
+ "touch_menu_button_14"
{
"activators"
{
@@ -1505,7 +1445,7 @@
{
}
}
- "touch_menu_button_18"
+ "touch_menu_button_15"
{
"activators"
{
@@ -1526,7 +1466,7 @@
{
}
}
- "touch_menu_button_19"
+ "touch_menu_button_16"
{
"activators"
{
@@ -1547,10 +1487,394 @@
{
}
}
+ "touch_menu_button_17"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_18"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_19"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
- "settings"
+ }
+ "group"
+ {
+ "id" "7"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
{
- "touchmenu_button_fire_type" "0"
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button start, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_left, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_right, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "10"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Quit Emulator, , "
+ "binding" "key_press Q, Quit Emulator, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 1 0 1, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Load State, , "
+ "binding" "key_press A, Load State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Save State, , "
+ "binding" "key_press S, Save State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
}
"group"
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon_simple.vdf
similarity index 85%
rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon.vdf
rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon_simple.vdf
index dfb479ca..c80c0468 100755
--- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon.vdf
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steam_controller_gordon_simple.vdf
@@ -1159,7 +1159,7 @@
{
"id" "38"
"mode" "radial_menu"
- "name" "Global Radial"
+ "name" "Simple Radial"
"description" ""
"inputs"
{
@@ -1351,7 +1351,7 @@
{
"bindings"
{
- "binding" "key_press F4, F4, RD-F4.png, "
+ "binding" "key_press F8, F8, RD-F8.png, "
}
"settings"
{
@@ -1364,66 +1364,6 @@
}
}
"touch_menu_button_10"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F5, F5, RD-F5.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_11"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F7, F7, RD-F7.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_12"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F8, F8, RD-F8.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_13"
{
"activators"
{
@@ -1443,7 +1383,7 @@
{
}
}
- "touch_menu_button_14"
+ "touch_menu_button_11"
{
"activators"
{
@@ -1464,7 +1404,7 @@
{
}
}
- "touch_menu_button_15"
+ "touch_menu_button_12"
{
"activators"
{
@@ -1485,7 +1425,7 @@
{
}
}
- "touch_menu_button_16"
+ "touch_menu_button_13"
{
"activators"
{
@@ -1506,7 +1446,7 @@
{
}
}
- "touch_menu_button_17"
+ "touch_menu_button_14"
{
"activators"
{
@@ -1527,7 +1467,7 @@
{
}
}
- "touch_menu_button_18"
+ "touch_menu_button_15"
{
"activators"
{
@@ -1548,7 +1488,7 @@
{
}
}
- "touch_menu_button_19"
+ "touch_menu_button_16"
{
"activators"
{
@@ -1569,10 +1509,394 @@
{
}
}
+ "touch_menu_button_17"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_18"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_19"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
- "settings"
+ }
+ "group"
+ {
+ "id" "7"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
{
- "touchmenu_button_fire_type" "0"
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button start, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_left, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_right, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "10"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Quit Emulator, , "
+ "binding" "key_press Q, Quit Emulator, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 1 0 1, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Load State, , "
+ "binding" "key_press A, Load State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Save State, , "
+ "binding" "key_press S, Save State, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button a, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button x, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button b, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, Take Steam Screenshot, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
}
"group"
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_neptune.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_full.vdf
similarity index 85%
rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_neptune.vdf
rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_full.vdf
index 8de2683f..a70c5839 100644
--- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_neptune.vdf
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_full.vdf
@@ -1,18 +1,18 @@
"controller_mappings"
{
"version" "3"
- "revision" "1706"
- "title" "RetroDECK: Official Layout - v0.7.1b"
- "description" "The Official RetroDECK Layout"
+ "revision" "1864"
+ "title" "RetroDECK: Steam Deck - Neptune v.1.1b FULL"
+ "description" "RetroDECK: Steam Deck - Neptune v.1.1b FULL"
"creator" ""
"progenitor" ""
"url" ""
- "export_type" "personal_cloud"
+ "export_type" ""
"controller_type" "controller_neptune"
"controller_caps" "23117823"
"major_revision" "0"
"minor_revision" "0"
- "Timestamp" "-918096944"
+ "Timestamp" "-1157598368"
"actions"
{
"Default"
@@ -57,7 +57,7 @@
}
"Preset_1000008"
{
- "title" "Emulators: Specific Features Menu - Set"
+ "title" "Emulator / Engine Specific - Set"
"legacy_set" "1"
}
"Preset_1000009"
@@ -80,11 +80,6 @@
"title" "DS Menu - Set"
"legacy_set" "1"
}
- "Preset_1000014"
- {
- "title" "Secrets Menu - Set"
- "legacy_set" "1"
- }
"Preset_1000015"
{
"title" "3DS Menu - Set"
@@ -95,6 +90,16 @@
"title" "Switch Menu - Set"
"legacy_set" "1"
}
+ "Preset_1000017"
+ {
+ "title" "ScummVM Menu - Set"
+ "legacy_set" "1"
+ }
+ "Preset_1000018"
+ {
+ "title" "GZDOOM Menu - Set"
+ "legacy_set" "1"
+ }
}
"action_layers"
{
@@ -1107,7 +1112,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 14 0 1, RetroDECK, RD-icon_circle_2_180x180.png, "
+ "binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, "
}
}
}
@@ -1123,7 +1128,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 3 0 1, Quick, RD-org.xfce.session.png, "
+ "binding" "controller_action CHANGE_PRESET 3 0 0, Quick, RD-org.xfce.session.png, "
}
}
}
@@ -1139,7 +1144,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 4 0 1, State, RD-folder-blue-games.png, "
+ "binding" "controller_action CHANGE_PRESET 4 0 0, State, RD-folder-blue-games.png, "
}
}
}
@@ -1155,7 +1160,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 5 0 1, Speed & Frames, RD-supertuxkart.png, "
+ "binding" "controller_action CHANGE_PRESET 5 0 0, Speed & Frames, RD-supertuxkart.png, "
}
}
}
@@ -1171,7 +1176,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 6 0 1, Display & Graphics, RD-preferences-desktop-display.png, "
+ "binding" "controller_action CHANGE_PRESET 6 0 0, Display & Graphics, RD-preferences-desktop-display.png, "
}
}
}
@@ -1187,7 +1192,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 7 0 1, General, RD-io.github.antimicrox.antimicrox.png, "
+ "binding" "controller_action CHANGE_PRESET 7 0 0, General, RD-io.github.antimicrox.antimicrox.png, "
}
}
}
@@ -1203,7 +1208,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 9 0 1, Specific, RD-folder-applications.png, "
+ "binding" "controller_action CHANGE_PRESET 9 0 0, Specific, RD-folder-applications.png, "
}
}
}
@@ -1219,7 +1224,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 8 0 1, Steam Deck, RD-steam.png, "
+ "binding" "controller_action CHANGE_PRESET 8 0 0, Steam Deck, RD-steam.png, "
}
}
}
@@ -1448,7 +1453,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, #232323 #FFFFFF"
+ "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, #232323 #FFFFFF"
}
}
}
@@ -1515,8 +1520,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_CONTROL, Take Screenshot, RD-camera-photo.png, "
- "binding" "key_press X, Take Screenshot, RD-camera-photo.png, "
+ "binding" "key_press LEFT_CONTROL, Save State, RD-document-save.png, "
+ "binding" "key_press S, Save State, RD-document-save.png, "
}
}
}
@@ -1532,8 +1537,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_CONTROL, Save State, RD-document-save.png, "
- "binding" "key_press S, Save State, RD-document-save.png, "
+ "binding" "key_press LEFT_CONTROL, Take Screenshot, RD-camera-photo.png, "
+ "binding" "key_press X, Take Screenshot, RD-camera-photo.png, "
}
}
}
@@ -1549,8 +1554,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_CONTROL, Load State, RD-folder-blue-backup.png, "
- "binding" "key_press A, Load State, RD-folder-blue-backup.png, "
+ "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, "
+ "binding" "key_press R, Restart / Reset, RD-system-reboot.png, "
}
}
}
@@ -1559,23 +1564,6 @@
}
}
"touch_menu_button_7"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Pause / Resume, RD-media-playback-pause.png, "
- "binding" "key_press P, Pause / Resume, RD-media-playback-pause.png, "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_8"
{
"activators"
{
@@ -1592,6 +1580,40 @@
{
}
}
+ "touch_menu_button_8"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Load State, RD-folder-blue-backup.png, "
+ "binding" "key_press A, Load State, RD-folder-blue-backup.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_9"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Pause / Resume, RD-media-playback-pause.png, "
+ "binding" "key_press P, Pause / Resume, RD-media-playback-pause.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
"touch_menu_button_10"
{
"activators"
@@ -1608,23 +1630,6 @@
{
}
}
- "touch_menu_button_11"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, "
- "binding" "key_press R, Restart / Reset, RD-system-reboot.png, "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
}
"settings"
{
@@ -1731,7 +1736,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -1740,57 +1745,6 @@
}
}
"touch_menu_button_1"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Previous State, RD-go-previous.png, #232323 #FFFFFF"
- "binding" "key_press J, Previous State, RD-go-previous.png, #232323 #FFFFFF"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_2"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Next State, RD-go-next.png, "
- "binding" "key_press K, Next State, RD-go-next.png, "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_3"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_CONTROL, Save State, RD-document-save.png, "
- "binding" "key_press S, Save State, RD-document-save.png, "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_4"
{
"activators"
{
@@ -1807,6 +1761,57 @@
{
}
}
+ "touch_menu_button_2"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Previous State, RD-go-previous.png, #232323 #FFFFFF"
+ "binding" "key_press J, Previous State, RD-go-previous.png, #232323 #FFFFFF"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_3"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Undo Save, RD-Arrow-34.png, "
+ "binding" "key_press 9, Undo Save, RD-Arrow-34.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_4"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Save State, RD-document-save.png, "
+ "binding" "key_press S, Save State, RD-document-save.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
"touch_menu_button_5"
{
"activators"
@@ -1815,8 +1820,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_CONTROL, Undo Load, RD-Arrow-33.png, "
- "binding" "key_press 8, Undo Load, RD-Arrow-33.png, "
+ "binding" "key_press LEFT_CONTROL, Next State, RD-go-next.png, "
+ "binding" "key_press K, Next State, RD-go-next.png, "
}
}
}
@@ -1832,8 +1837,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_CONTROL, Undo Save, RD-Arrow-34.png, "
- "binding" "key_press 9, Undo Save, RD-Arrow-34.png, "
+ "binding" "key_press LEFT_CONTROL, Undo Load, RD-Arrow-33.png, "
+ "binding" "key_press 8, Undo Load, RD-Arrow-33.png, "
}
}
}
@@ -2196,7 +2201,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -2678,7 +2683,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -3143,7 +3148,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -3659,7 +3664,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -3675,7 +3680,7 @@
{
"bindings"
{
- "binding" "controller_action SCREENSHOT, Steam Screenshot, RD-applets-screenshooter.png, "
+ "binding" "key_press ESCAPE, Escape, RD-ESC.png, "
}
}
}
@@ -3691,7 +3696,7 @@
{
"bindings"
{
- "binding" "controller_action SHOW_KEYBOARD, Show Keyboard, RD-preferences-desktop-keyboard.png, "
+ "binding" "key_press RETURN, Enter, RD-Enter.png, "
}
}
}
@@ -3707,7 +3712,7 @@
{
"bindings"
{
- "binding" "key_press ESCAPE, Escape, RD-ESC.png, "
+ "binding" "key_press SPACE, Space, RD-space.png, "
}
}
}
@@ -3723,8 +3728,7 @@
{
"bindings"
{
- "binding" "key_press LEFT_ALT, ALT + F4, RD-F4.png, "
- "binding" "key_press F4, ALT + F4, RD-F4.png, "
+ "binding" "key_press TAB, Tab, RD-Tab.png, "
}
}
}
@@ -3740,7 +3744,7 @@
{
"bindings"
{
- "binding" "key_press TAB, Tab, RD-Tab.png, "
+ "binding" "key_press LEFT_SHIFT, Shift, RD-shift.png, "
}
}
}
@@ -3756,7 +3760,7 @@
{
"bindings"
{
- "binding" "key_press RETURN, Enter, RD-Enter.png, "
+ "binding" "key_press LEFT_CONTROL, Ctrl, RD-ctrl.png, "
}
}
}
@@ -3765,6 +3769,38 @@
}
}
"touch_menu_button_7"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_8"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Alt, RD-alt.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_9"
{
"activators"
{
@@ -3780,6 +3816,135 @@
{
}
}
+ "touch_menu_button_10"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F4, F4, RD-F4.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_11"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F5, F5, RD-F5.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_12"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F7, F7, RD-F7.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_13"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F8, F8, RD-F8.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_14"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F10, F10, RD-F10.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_15"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SHOW_KEYBOARD, Show Keyboard, RD-preferences-desktop-keyboard.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_16"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action SCREENSHOT, Steam Screenshot, RD-applets-screenshooter.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_17"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
"settings"
{
@@ -4123,7 +4288,7 @@
{
"id" "128"
"mode" "radial_menu"
- "name" "Emulators: Specific Features - Menu"
+ "name" "Emulator / Engine Specific - Menu"
"description" ""
"inputs"
{
@@ -4135,7 +4300,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 1 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -4151,7 +4316,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 10 0 1, MAME, RD-mame.png, "
+ "binding" "controller_action CHANGE_PRESET 10 0 0, MAME, RD-mame.png, "
}
}
}
@@ -4167,7 +4332,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 11 0 1, RetroArch, RD-retroarch.png, "
+ "binding" "controller_action CHANGE_PRESET 11 0 0, RetroArch, RD-retroarch.png, "
}
}
}
@@ -4183,7 +4348,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 12 0 1, Gamecube & Wii, RD-dolphin.png, "
+ "binding" "controller_action CHANGE_PRESET 12 0 0, Gamecube & Wii, RD-dolphin.png, "
}
}
}
@@ -4199,7 +4364,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 13 0 1, NDS, RD-melonds.png, "
+ "binding" "controller_action CHANGE_PRESET 13 0 0, NDS, RD-melonds.png, "
}
}
}
@@ -4215,7 +4380,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 15 0 1, 3DS, RD-citra.png, "
+ "binding" "controller_action CHANGE_PRESET 14 0 0, 3DS, RD-citra.png, "
}
}
}
@@ -4231,7 +4396,39 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 16 0 1, Switch, RD-ryujinx.png, "
+ "binding" "controller_action CHANGE_PRESET 15 0 0, Switch, RD-ryujinx.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_7"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 17 0 0, GZDoom, RD-gzdoom.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_8"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 16 0 0, SCUMMVM, RD-click.png, "
}
}
}
@@ -4594,7 +4791,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -4611,6 +4808,7 @@
"bindings"
{
"binding" "key_press LEFT_ALT, Service Mode, RD-emblem-documents.png, "
+ "binding" "key_press S, Service Mode, RD-emblem-documents.png, "
"binding" "key_press 0, Service Mode, RD-emblem-documents.png, "
}
}
@@ -4628,6 +4826,7 @@
"bindings"
{
"binding" "key_press LEFT_ALT, Button 1 - Service, RD-Arcade-BLUE.png, "
+ "binding" "key_press S, Button 1 - Service, RD-Arcade-BLUE.png, "
"binding" "key_press 1, Button 1 - Service, RD-Arcade-BLUE.png, "
}
}
@@ -4645,6 +4844,7 @@
"bindings"
{
"binding" "key_press LEFT_ALT, Button 2 - Service, RD-Arcade-GREEN.png, "
+ "binding" "key_press S, Button 2 - Service, RD-Arcade-GREEN.png, "
"binding" "key_press 2, Button 2 - Service, RD-Arcade-GREEN.png, "
}
}
@@ -4662,6 +4862,7 @@
"bindings"
{
"binding" "key_press LEFT_ALT, Button 3 - Service, RD-Arcade-RED.png, "
+ "binding" "key_press S, Button 3 - Service, RD-Arcade-RED.png, "
"binding" "key_press 3, Button 3 - Service, RD-Arcade-RED.png, "
}
}
@@ -4679,6 +4880,7 @@
"bindings"
{
"binding" "key_press LEFT_ALT, Button 4 - Service, RD-Arcade-YELLOW.png, "
+ "binding" "key_press S, Button 4 - Service, RD-Arcade-YELLOW.png, "
"binding" "key_press 4, Button 4 - Service, RD-Arcade-YELLOW.png, "
}
}
@@ -4695,8 +4897,9 @@
{
"bindings"
{
- "binding" "key_press LEFT_ALT, Bill / Note - Player 1, RD-emblem-generic.png, "
- "binding" "key_press 5, Bill / Note - Player 1, RD-emblem-generic.png, "
+ "binding" "key_press LEFT_ALT, Insert Bill, RD-emblem-generic.png, "
+ "binding" "key_press B, Insert Bill, RD-emblem-generic.png, "
+ "binding" "key_press 1, Insert Bill, RD-emblem-generic.png, "
}
}
}
@@ -4712,8 +4915,81 @@
{
"bindings"
{
- "binding" "key_press LEFT_ALT, Tilt - Player 1, RD-emblem-synchronizing.png, "
- "binding" "key_press 6, Tilt - Player 1, RD-emblem-synchronizing.png, "
+ "binding" "key_press LEFT_ALT, Tilt - Player 4, RD-tilt-4.png, "
+ "binding" "key_press T, Tilt - Player 4, RD-tilt-4.png, "
+ "binding" "key_press 4, Tilt - Player 4, RD-tilt-4.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_8"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Tilt - Player 3, RD-tilt-3.png, "
+ "binding" "key_press T, Tilt - Player 3, RD-tilt-3.png, "
+ "binding" "key_press 3, Tilt - Player 3, RD-tilt-3.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_9"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Tilt - Player 2, RD-tilt-2.png, "
+ "binding" "key_press T, Tilt - Player 2, RD-tilt-2.png, "
+ "binding" "key_press 2, Tilt - Player 2, RD-tilt-2.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_10"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Tilt - Player 1, RD-tilt-1.png, "
+ "binding" "key_press T, Tilt - Player 1, RD-tilt-1.png, "
+ "binding" "key_press 1, Tilt - Player 1, RD-tilt-1.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_11"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Tilt, rd-tilt.png, "
+ "binding" "key_press T, Tilt, rd-tilt.png, "
+ "binding" "key_press 0, Tilt, rd-tilt.png, "
}
}
}
@@ -5002,7 +5278,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -5035,8 +5311,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_CONTROL, Previous Cheat, RD-go-previous.png, "
- "binding" "key_press F, Previous Cheat, RD-go-previous.png, "
+ "binding" "key_press LEFT_CONTROL, Cheats Toggle, RD-utilities-terminal.png, "
+ "binding" "key_press C, Cheats Toggle, RD-utilities-terminal.png, "
}
}
}
@@ -5052,8 +5328,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_CONTROL, Cheats Toggle, RD-utilities-terminal.png, "
- "binding" "key_press C, Cheats Toggle, RD-utilities-terminal.png, "
+ "binding" "key_press LEFT_CONTROL, Previous Cheat, RD-go-previous.png, "
+ "binding" "key_press F, Previous Cheat, RD-go-previous.png, "
}
}
}
@@ -5524,7 +5800,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -5533,40 +5809,6 @@
}
}
"touch_menu_button_1"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_ALT, Netplay - Golf Mode, RD-distributor-logo-netbsd.png, "
- "binding" "key_press H, Netplay - Golf Mode, RD-distributor-logo-netbsd.png, "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_2"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press LEFT_ALT, Freelook Mode - Toggle, RD-preferences-system-search.png, "
- "binding" "key_press F, Freelook Mode - Toggle, RD-preferences-system-search.png, "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_3"
{
"activators"
{
@@ -5583,6 +5825,40 @@
{
}
}
+ "touch_menu_button_2"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Netplay - Golf Mode, RD-distributor-logo-netbsd.png, "
+ "binding" "key_press H, Netplay - Golf Mode, RD-distributor-logo-netbsd.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_3"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Freelook Mode - Toggle, RD-preferences-system-search.png, "
+ "binding" "key_press F, Freelook Mode - Toggle, RD-preferences-system-search.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
"touch_menu_button_4"
{
"activators"
@@ -5591,8 +5867,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-emblem-encrypted-unlocked.png, #232323 #ADA200"
- "binding" "key_press Z, Wiimote - Upright Mode, RD-emblem-encrypted-unlocked.png, #232323 #ADA200"
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
}
}
}
@@ -5608,8 +5884,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-emblem-encrypted-locked.png, #232323 #48B119"
- "binding" "key_press X, Wiimote - Sideways Mode, RD-emblem-encrypted-locked.png, #232323 #48B119"
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
}
}
}
@@ -5625,8 +5901,80 @@
{
"bindings"
{
- "binding" "key_press LEFT_ALT, Reset Freelook Camera, RD-preferences-system-search.png, #232323 #AD0000"
- "binding" "key_press R, Reset Freelook Camera, RD-preferences-system-search.png, #232323 #AD0000"
+ "binding" "key_press LEFT_ALT, Reset Freelook Camera, RD-view-refresh.png, "
+ "binding" "key_press R, Reset Freelook Camera, RD-view-refresh.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_7"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Sync Wii Mote 4, RD-wii-4.png, "
+ "binding" "key_press W, Sync Wii Mote 4, RD-wii-4.png, "
+ "binding" "key_press 4, Sync Wii Mote 4, RD-wii-4.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_8"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Sync Wii Mote 3, RD-wii-3.png, "
+ "binding" "key_press W, Sync Wii Mote 3, RD-wii-3.png, "
+ "binding" "key_press 3, Sync Wii Mote 3, RD-wii-3.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_9"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Sync Wii Mote 2, RD-wii-2.png, "
+ "binding" "key_press W, Sync Wii Mote 2, RD-wii-2.png, "
+ "binding" "key_press 2, Sync Wii Mote 2, RD-wii-2.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_10"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Sync Wii Mote 1, RD-wii-1.png, "
+ "binding" "key_press W, Sync Wii Mote 1, RD-wii-1.png, "
+ "binding" "key_press 1, Sync Wii Mote 1, RD-wii-1.png, "
}
}
}
@@ -5989,7 +6337,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -6022,8 +6370,8 @@
{
"bindings"
{
- "binding" "key_press LEFT_ALT, Play Microphone, RD-media-playback-start.png, "
- "binding" "key_press P, Play Microphone, RD-media-playback-start.png, "
+ "binding" "key_press LEFT_ALT, Blow Microphone, RD-media-playback-start.png, "
+ "binding" "key_press P, Blow Microphone, RD-media-playback-start.png, "
}
}
}
@@ -6451,530 +6799,6 @@
}
}
"group"
- {
- "id" "189"
- "mode" "four_buttons"
- "name" ""
- "description" ""
- "inputs"
- {
- "button_a"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button A, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_b"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button B, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_x"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button X, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_y"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button Y, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "190"
- "mode" "radial_menu"
- "name" "Secrets - Menu"
- "description" ""
- "inputs"
- {
- "touch_menu_button_0"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "controller_action CHANGE_PRESET 1 0 1, Back, RD-edit-undo-red.png, "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_1"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_UP, Konami Deck, RD-retrodeck-compact.png, "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_UP, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_DOWN, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_DOWN, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_LEFT, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_RIGHT, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_LEFT, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_RIGHT, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press A, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press B, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_2"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press 3, Here be dragons!, RD-vcmi.png, "
- "binding" "key_press 2, Here be dragons!, RD-vcmi.png, "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press 1, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press 6, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press 7, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_3"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press I, You can do it!, RD-gzdoom.png, "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press D, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press D, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press Q, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press D, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "touchmenu_button_fire_type" "1"
- }
- }
- "group"
- {
- "id" "191"
- "mode" "absolute_mouse"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Soft_Press"
- {
- "bindings"
- {
- "binding" "mouse_button LEFT, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "192"
- "mode" "joystick_move"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button JOYSTICK_LEFT, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "deadzone_inner_radius" "7199"
- }
- }
- "group"
- {
- "id" "193"
- "mode" "trigger"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button TRIGGER_LEFT, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "output_trigger" "1"
- }
- }
- "group"
- {
- "id" "194"
- "mode" "trigger"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button TRIGGER_RIGHT, , "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "output_trigger" "2"
- }
- }
- "group"
- {
- "id" "195"
- "mode" "joystick_move"
- "name" ""
- "description" ""
- "inputs"
- {
- "click"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button JOYSTICK_RIGHT, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "196"
- "mode" "dpad"
- "name" ""
- "description" ""
- "inputs"
- {
- "dpad_north"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_UP, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_south"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_DOWN, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_east"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_RIGHT, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "dpad_west"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button DPAD_LEFT, , "
- }
- "settings"
- {
- "haptic_intensity" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- "settings"
- {
- "requires_click" "0"
- "haptic_intensity_override" "0"
- }
- }
- "group"
- {
- "id" "197"
- "mode" "mouse_joystick"
- "name" ""
- "description" ""
- "inputs"
- {
- }
- }
- "group"
{
"id" "199"
"mode" "four_buttons"
@@ -7064,7 +6888,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -7461,7 +7285,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 9 0 1, Back, RD-edit-undo-red.png, "
+ "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, "
}
}
}
@@ -7959,6 +7783,1175 @@
}
}
"group"
+ {
+ "id" "222"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "223"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "225"
+ "mode" "four_buttons"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_a"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button A, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_b"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button B, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_x"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button X, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_y"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button Y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "226"
+ "mode" "radial_menu"
+ "name" "ScummVM - Menu"
+ "description" ""
+ "inputs"
+ {
+ "touch_menu_button_0"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_1"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press O, Open, rd-pc-open.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_2"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press C, Close, rd-pc-close.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_3"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F, Fight, rd-pc-fight.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_4"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press U, Use, rd-pc-use.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_5"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press P, Pick-Up, rd-pc-pickup.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_6"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press S, Push / Shove, rd-pc-push.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_7"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press Y, Pull / Yank, rd-pc-pull.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_8"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press L, Look-At, rd-pc-look.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_9"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press T, Talk To, rd-pc-talk.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_10"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press G, Give, rd-pc-give.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_11"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press M, Move, rd-pc-move.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "touchmenu_button_fire_type" "1"
+ }
+ }
+ "group"
+ {
+ "id" "227"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Soft_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button LEFT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "228"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "deadzone_inner_radius" "7199"
+ }
+ }
+ "group"
+ {
+ "id" "229"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button TRIGGER_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "1"
+ }
+ }
+ "group"
+ {
+ "id" "230"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button TRIGGER_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "2"
+ }
+ }
+ "group"
+ {
+ "id" "231"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_RIGHT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "232"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_UP, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_DOWN, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ "haptic_intensity_override" "0"
+ }
+ }
+ "group"
+ {
+ "id" "233"
+ "mode" "mouse_joystick"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ }
+ "group"
+ {
+ "id" "234"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "235"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "236"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "237"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "238"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "239"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "240"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "241"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "242"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "243"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "244"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "246"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "247"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "248"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "250"
+ "mode" "four_buttons"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_a"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button A, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_b"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button B, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_x"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button X, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_y"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button Y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "251"
+ "mode" "radial_menu"
+ "name" "GZDoom - Menu"
+ "description" ""
+ "inputs"
+ {
+ "touch_menu_button_0"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 9 0 0, Back, RD-edit-undo-red.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_1"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press I, Get All Items, RD-freedoom-pack3.png, "
+ "binding" "key_press D, Get All Items, RD-freedoom-pack3.png, "
+ "binding" "key_press F, Get All Items, RD-freedoom-pack3.png, "
+ "binding" "key_press A, Get All Items, RD-freedoom-pack3.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_2"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press I, Get All Items + Keys, RD-freedoom-pack2.png, "
+ "binding" "key_press D, Get All Items + Keys, RD-freedoom-pack2.png, "
+ "binding" "key_press K, Get All Items + Keys, RD-freedoom-pack2.png, "
+ "binding" "key_press F, Get All Items + Keys, RD-freedoom-pack2.png, "
+ "binding" "key_press A, Get All Items + Keys, RD-freedoom-pack2.png, "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "touchmenu_button_fire_type" "1"
+ }
+ }
+ "group"
+ {
+ "id" "252"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Soft_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button LEFT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "253"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "deadzone_inner_radius" "7199"
+ }
+ }
+ "group"
+ {
+ "id" "254"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button TRIGGER_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "1"
+ }
+ }
+ "group"
+ {
+ "id" "255"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button TRIGGER_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "2"
+ }
+ }
+ "group"
+ {
+ "id" "256"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_RIGHT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "257"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_UP, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_DOWN, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ "haptic_intensity_override" "0"
+ }
+ }
+ "group"
+ {
+ "id" "258"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
{
"id" "34"
"mode" "switches"
@@ -7997,7 +8990,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -8077,7 +9070,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -8097,7 +9090,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -8162,7 +9155,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -8242,7 +9235,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -8262,7 +9255,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -8321,7 +9314,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 1 0 0, , "
}
}
"Full_Press"
@@ -8394,7 +9387,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 1 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 1 0 0, , "
}
}
}
@@ -8459,7 +9452,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -8539,7 +9532,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -8559,7 +9552,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -8624,7 +9617,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -8704,7 +9697,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -8724,7 +9717,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -8789,7 +9782,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -8869,7 +9862,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -8889,7 +9882,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -8954,7 +9947,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -9034,7 +10027,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -9054,7 +10047,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -9119,7 +10112,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -9199,7 +10192,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -9219,7 +10212,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -9284,7 +10277,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -9364,7 +10357,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -9384,7 +10377,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -9449,7 +10442,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -9529,7 +10522,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -9549,7 +10542,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -9614,7 +10607,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -9694,7 +10687,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -9714,7 +10707,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -9779,7 +10772,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -9859,7 +10852,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -9879,7 +10872,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -9944,7 +10937,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -10024,7 +11017,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -10044,172 +11037,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_capture"
- {
- "activators"
- {
- "release"
- {
- "bindings"
- {
- "binding" "controller_action system_key_1, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- }
- }
- "group"
- {
- "id" "188"
- "mode" "switches"
- "name" ""
- "description" ""
- "inputs"
- {
- "button_escape"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button start, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_menu"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button select, , "
- }
- }
- "Full_Press"
- {
- "bindings"
- {
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "left_bumper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button shoulder_left, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "right_bumper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button shoulder_right, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_back_left"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button B, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_back_right"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "xinput_button A, , "
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_back_left_upper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
- }
- "settings"
- {
- "toggle" "1"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "button_back_right_upper"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -10274,7 +11102,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -10354,7 +11182,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -10374,7 +11202,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -10439,7 +11267,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
}
}
}
@@ -10519,7 +11347,7 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
"settings"
{
@@ -10539,7 +11367,337 @@
{
"bindings"
{
- "binding" "controller_action CHANGE_PRESET 2 0 1, Hotkey, , "
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action system_key_1, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "224"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button start, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button select, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_left, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_right, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button B, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button A, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
+ }
+ "settings"
+ {
+ "toggle" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action system_key_1, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "249"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button start, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button select, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_left, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_right, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button B, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button A, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
+ }
+ "settings"
+ {
+ "toggle" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
}
}
}
@@ -10588,7 +11746,8 @@
"8" "right_joystick active"
"9" "dpad active"
"14" "gyro inactive"
- "15" "gyro active"
+ "15" "gyro inactive"
+ "222" "gyro active"
}
}
"preset"
@@ -10599,16 +11758,17 @@
{
"19" "switch active"
"16" "button_diamond active"
- "23" "joystick inactive"
- "219" "joystick active"
+ "23" "joystick active"
+ "219" "joystick inactive"
"17" "left_trigger active"
"18" "right_trigger active"
- "22" "right_joystick inactive"
- "218" "right_joystick active"
+ "22" "right_joystick active"
+ "218" "right_joystick inactive"
"20" "dpad inactive"
"21" "dpad active"
"45" "gyro inactive"
- "176" "gyro active"
+ "176" "gyro inactive"
+ "234" "gyro active"
}
}
"preset"
@@ -10627,7 +11787,8 @@
"41" "right_joystick active"
"42" "dpad active"
"43" "gyro inactive"
- "177" "gyro active"
+ "177" "gyro inactive"
+ "235" "gyro active"
}
}
"preset"
@@ -10646,7 +11807,8 @@
"53" "right_joystick active"
"54" "dpad active"
"55" "gyro inactive"
- "178" "gyro active"
+ "178" "gyro inactive"
+ "236" "gyro active"
}
}
"preset"
@@ -10665,7 +11827,8 @@
"63" "right_joystick active"
"64" "dpad active"
"65" "gyro inactive"
- "179" "gyro active"
+ "179" "gyro inactive"
+ "237" "gyro active"
}
}
"preset"
@@ -10684,7 +11847,8 @@
"73" "right_joystick active"
"74" "dpad active"
"75" "gyro inactive"
- "180" "gyro active"
+ "180" "gyro inactive"
+ "238" "gyro active"
}
}
"preset"
@@ -10703,7 +11867,8 @@
"83" "right_joystick active"
"84" "dpad active"
"85" "gyro inactive"
- "181" "gyro active"
+ "181" "gyro inactive"
+ "239" "gyro active"
}
}
"preset"
@@ -10722,7 +11887,8 @@
"123" "right_joystick active"
"124" "dpad active"
"125" "gyro inactive"
- "182" "gyro active"
+ "182" "gyro inactive"
+ "223" "gyro active"
}
}
"preset"
@@ -10741,7 +11907,8 @@
"133" "right_joystick active"
"134" "dpad active"
"135" "gyro inactive"
- "183" "gyro active"
+ "183" "gyro inactive"
+ "240" "gyro active"
}
}
"preset"
@@ -10760,7 +11927,8 @@
"143" "right_joystick active"
"144" "dpad active"
"145" "gyro inactive"
- "184" "gyro active"
+ "184" "gyro inactive"
+ "241" "gyro active"
}
}
"preset"
@@ -10779,7 +11947,8 @@
"153" "right_joystick active"
"154" "dpad active"
"155" "gyro inactive"
- "185" "gyro active"
+ "185" "gyro inactive"
+ "242" "gyro active"
}
}
"preset"
@@ -10798,7 +11967,8 @@
"163" "right_joystick active"
"164" "dpad active"
"165" "gyro inactive"
- "186" "gyro active"
+ "186" "gyro inactive"
+ "243" "gyro active"
}
}
"preset"
@@ -10817,30 +11987,13 @@
"173" "right_joystick active"
"174" "dpad active"
"175" "gyro inactive"
- "187" "gyro active"
+ "187" "gyro inactive"
+ "244" "gyro active"
}
}
"preset"
{
"id" "13"
- "name" "Preset_1000014"
- "group_source_bindings"
- {
- "188" "switch active"
- "189" "button_diamond active"
- "190" "left_trackpad active"
- "191" "right_trackpad active"
- "192" "joystick active"
- "193" "left_trigger active"
- "194" "right_trigger active"
- "195" "right_joystick active"
- "196" "dpad active"
- "197" "gyro active"
- }
- }
- "preset"
- {
- "id" "14"
"name" "Preset_1000015"
"group_source_bindings"
{
@@ -10853,12 +12006,13 @@
"204" "right_trigger active"
"205" "right_joystick active"
"206" "dpad active"
- "207" "gyro active"
+ "207" "gyro inactive"
+ "246" "gyro active"
}
}
"preset"
{
- "id" "15"
+ "id" "14"
"name" "Preset_1000016"
"group_source_bindings"
{
@@ -10871,7 +12025,45 @@
"214" "right_trigger active"
"215" "right_joystick active"
"216" "dpad active"
- "217" "gyro active"
+ "217" "gyro inactive"
+ "247" "gyro active"
+ }
+ }
+ "preset"
+ {
+ "id" "15"
+ "name" "Preset_1000017"
+ "group_source_bindings"
+ {
+ "224" "switch active"
+ "225" "button_diamond active"
+ "226" "left_trackpad active"
+ "227" "right_trackpad active"
+ "228" "joystick active"
+ "229" "left_trigger active"
+ "230" "right_trigger active"
+ "231" "right_joystick active"
+ "232" "dpad active"
+ "233" "gyro inactive"
+ "248" "gyro active"
+ }
+ }
+ "preset"
+ {
+ "id" "16"
+ "name" "Preset_1000018"
+ "group_source_bindings"
+ {
+ "249" "switch active"
+ "250" "button_diamond active"
+ "251" "left_trackpad active"
+ "252" "right_trackpad active"
+ "253" "joystick active"
+ "254" "left_trigger active"
+ "255" "right_trigger active"
+ "256" "right_joystick active"
+ "257" "dpad active"
+ "258" "gyro active"
}
}
"settings"
@@ -10880,3 +12072,4 @@
"right_trackpad_mode" "0"
}
}
+
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_simple.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_simple.vdf
new file mode 100644
index 00000000..4c597417
--- /dev/null
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_steamdeck_neptune_simple.vdf
@@ -0,0 +1,1918 @@
+"controller_mappings"
+{
+ "version" "3"
+ "revision" "1874"
+ "title" "RetroDECK: Steam Deck - Neptune v.1b SIMPLE"
+ "description" "RetroDECK: Steam Deck - Neptune v.1b SIMPLE"
+ "creator" ""
+ "progenitor" ""
+ "url" ""
+ "export_type" ""
+ "controller_type" "controller_neptune"
+ "controller_caps" "23117823"
+ "major_revision" "0"
+ "minor_revision" "0"
+ "Timestamp" "-942108240"
+ "actions"
+ {
+ "Default"
+ {
+ "title" "RetroDECK - Set"
+ "legacy_set" "1"
+ }
+ "Preset_1000001"
+ {
+ "title" "Global Hotkeys - Set"
+ "legacy_set" "1"
+ }
+ }
+ "action_layers"
+ {
+ }
+ "localization"
+ {
+ "english"
+ {
+ "title" "Gamepad with Gyro"
+ "description" "The template works best for games that are designed with a gamepad in mind, but also support a desktop mouse for camera control or aim. This uses both the right pad and the gyro to allow for the most precise aim in games which support gamepad and mouse."
+ }
+ }
+ "group"
+ {
+ "id" "0"
+ "mode" "four_buttons"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_a"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button A, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_b"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button B, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_x"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button X, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_y"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button Y, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "1"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button dpad_up, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button dpad_down, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button dpad_right, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button dpad_left, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "2"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Soft_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_RIGHT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "3"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "deadzone_inner_radius" "7199"
+ }
+ }
+ "group"
+ {
+ "id" "4"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button TRIGGER_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "1"
+ }
+ }
+ "group"
+ {
+ "id" "5"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button TRIGGER_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "output_trigger" "2"
+ }
+ }
+ "group"
+ {
+ "id" "6"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Soft_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_RIGHT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "8"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button JOYSTICK_RIGHT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "9"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_UP, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_DOWN, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_RIGHT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button DPAD_LEFT, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ "haptic_intensity_override" "0"
+ }
+ }
+ "group"
+ {
+ "id" "10"
+ "mode" "single_button"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Soft_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button START, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "11"
+ "mode" "single_button"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Soft_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "12"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Soft_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button LEFT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "13"
+ "mode" "joystick_camera"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ }
+ "group"
+ {
+ "id" "14"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ }
+ "group"
+ {
+ "id" "15"
+ "mode" "mouse_joystick"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ }
+ "group"
+ {
+ "id" "16"
+ "mode" "four_buttons"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_a"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, PAUSE TOGGLE, , "
+ "binding" "key_press P, PAUSE TOGGLE, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_b"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, CAPTURE SCREENSHOT, , "
+ "binding" "key_press X, CAPTURE SCREENSHOT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_x"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, FULLSCREEN TOGGLE, , "
+ "binding" "key_press RETURN, FULLSCREEN TOGGLE, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_y"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Open Menu, , "
+ "binding" "key_press M, Open Menu, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "17"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, REWIND, , "
+ "binding" "key_press KEYPAD_DASH, REWIND, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "18"
+ "mode" "trigger"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, FAST FORWARD, , "
+ "binding" "key_press KEYPAD_PLUS, FAST FORWARD, , "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "20"
+ "mode" "four_buttons"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_a"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action empty_sub_command, , "
+ "binding" "controller_action empty_sub_command, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "21"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Increase Emulation Speed, , "
+ "binding" "key_press 1, Increase Emulation Speed, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Decrease Emulation Speed, , "
+ "binding" "key_press 2, Decrease Emulation Speed, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, NEXT SAVE SLOT, , "
+ "binding" "key_press K, NEXT SAVE SLOT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, PREVIOUS SAVE SLOT, , "
+ "binding" "key_press J, PREVIOUS SAVE SLOT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ "haptic_intensity_override" "0"
+ }
+ }
+ "group"
+ {
+ "id" "22"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press ESCAPE, Escape, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "23"
+ "mode" "joystick_move"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, SWAP SCREENS, , "
+ "binding" "key_press TAB, SWAP SCREENS, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "45"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ }
+ "group"
+ {
+ "id" "176"
+ "mode" "mouse_joystick"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ }
+ "group"
+ {
+ "id" "218"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_SHIFT, , "
+ "binding" "key_press W, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_SHIFT, , "
+ "binding" "key_press S, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_east"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_SHIFT, , "
+ "binding" "key_press D, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_west"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_SHIFT, , "
+ "binding" "key_press A, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press ESCAPE, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "219"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "dpad_north"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_SHIFT, , "
+ "binding" "key_press E, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "dpad_south"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_SHIFT, , "
+ "binding" "key_press Q, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "click"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, , "
+ "binding" "key_press TAB, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "235"
+ "mode" "radial_menu"
+ "name" "Simple Radial"
+ "description" ""
+ "inputs"
+ {
+ "touch_menu_button_0"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_1"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press ESCAPE, Escape, RD-ESC.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_2"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press RETURN, Enter, RD-Enter.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_3"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press TAB, Tab, RD-Tab.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_4"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Control, RD-ctrl.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_5"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press SPACE, Space, RD-space.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_6"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_7"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Alt, RD-alt.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_8"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F1, F1, RD-F1.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_9"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F8, F8, RD-F8.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_10"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press F10, F10, RD-F10.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_11"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, "
+ "binding" "key_press R, Restart / Reset, RD-system-reboot.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_12"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wii Sync Button, RD-notification-network-wireless.png, "
+ "binding" "key_press W, Wii Sync Button, RD-notification-network-wireless.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_13"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Swap Dual - Screens, RD-system-switch-user.png, "
+ "binding" "key_press TAB, Swap Dual - Screens, RD-system-switch-user.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_14"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
+ "binding" "key_press L, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_15"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
+ "binding" "key_press W, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_16"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, Swap Disc, RD-application-x-iso.png, "
+ "binding" "key_press D, Swap Disc, RD-application-x-iso.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_17"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_18"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_19"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "222"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "234"
+ "mode" "dpad"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ }
+ "settings"
+ {
+ "requires_click" "0"
+ }
+ }
+ "group"
+ {
+ "id" "236"
+ "mode" "reference"
+ "description" ""
+ "settings"
+ {
+ "referenced_mode" "235"
+ }
+ }
+ "group"
+ {
+ "id" "237"
+ "mode" "reference"
+ "description" ""
+ "settings"
+ {
+ "referenced_mode" "235"
+ }
+ }
+ "group"
+ {
+ "id" "238"
+ "mode" "absolute_mouse"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "click"
+ {
+ "activators"
+ {
+ "Soft_Press"
+ {
+ "bindings"
+ {
+ "binding" "mouse_button LEFT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "7"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button start, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button select, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_left, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button shoulder_right, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button B, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button A, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
+ }
+ "settings"
+ {
+ "toggle" "1"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 2 0 0, Hotkey, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action system_key_1, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "group"
+ {
+ "id" "19"
+ "mode" "switches"
+ "name" ""
+ "description" ""
+ "inputs"
+ {
+ "button_escape"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, EXIT EMULATOR, , "
+ "binding" "key_press Q, EXIT EMULATOR, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_menu"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 1 0 0, , "
+ }
+ }
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "xinput_button SELECT, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "left_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, LOAD STATE, , "
+ "binding" "key_press A, LOAD STATE, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "right_bumper"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_CONTROL, SAVE STATE, , "
+ "binding" "key_press S, SAVE STATE, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_left_upper"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 1 0 0, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_back_right_upper"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action CHANGE_PRESET 1 0 0, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "button_capture"
+ {
+ "activators"
+ {
+ "release"
+ {
+ "bindings"
+ {
+ "binding" "controller_action system_key_1, , "
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ }
+ }
+ "preset"
+ {
+ "id" "0"
+ "name" "Default"
+ "group_source_bindings"
+ {
+ "7" "switch active"
+ "0" "button_diamond active"
+ "1" "left_trackpad inactive"
+ "11" "left_trackpad inactive"
+ "236" "left_trackpad active"
+ "2" "right_trackpad inactive"
+ "6" "right_trackpad inactive"
+ "10" "right_trackpad inactive"
+ "12" "right_trackpad active"
+ "13" "right_trackpad inactive"
+ "3" "joystick active"
+ "235" "joystick inactive"
+ "4" "left_trigger active"
+ "5" "right_trigger active"
+ "8" "right_joystick active"
+ "9" "dpad active"
+ "14" "gyro inactive"
+ "15" "gyro inactive"
+ "222" "gyro active"
+ }
+ }
+ "preset"
+ {
+ "id" "1"
+ "name" "Preset_1000001"
+ "group_source_bindings"
+ {
+ "19" "switch active"
+ "16" "button_diamond active"
+ "237" "left_trackpad active"
+ "238" "right_trackpad active"
+ "23" "joystick active"
+ "219" "joystick inactive"
+ "17" "left_trigger active"
+ "18" "right_trigger active"
+ "22" "right_joystick active"
+ "218" "right_joystick inactive"
+ "20" "dpad inactive"
+ "21" "dpad active"
+ "45" "gyro inactive"
+ "176" "gyro inactive"
+ "234" "gyro active"
+ }
+ }
+ "settings"
+ {
+ "left_trackpad_mode" "0"
+ "right_trackpad_mode" "0"
+ }
+}
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro_simple.vdf
similarity index 97%
rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro.vdf
rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro_simple.vdf
index c4c07a17..cf6d1e34 100755
--- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro.vdf
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_switch_pro_simple.vdf
@@ -905,7 +905,7 @@
{
"id" "22"
"mode" "radial_menu"
- "name" "Global Radial"
+ "name" "Simple Radial"
"description" ""
"inputs"
{
@@ -1097,7 +1097,7 @@
{
"bindings"
{
- "binding" "key_press F4, F4, RD-F4.png, "
+ "binding" "key_press F8, F8, RD-F8.png, "
}
"settings"
{
@@ -1110,66 +1110,6 @@
}
}
"touch_menu_button_10"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F5, F5, RD-F5.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_11"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F7, F7, RD-F7.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_12"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F8, F8, RD-F8.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_13"
{
"activators"
{
@@ -1189,7 +1129,7 @@
{
}
}
- "touch_menu_button_14"
+ "touch_menu_button_11"
{
"activators"
{
@@ -1210,7 +1150,7 @@
{
}
}
- "touch_menu_button_15"
+ "touch_menu_button_12"
{
"activators"
{
@@ -1231,7 +1171,7 @@
{
}
}
- "touch_menu_button_16"
+ "touch_menu_button_13"
{
"activators"
{
@@ -1252,7 +1192,7 @@
{
}
}
- "touch_menu_button_17"
+ "touch_menu_button_14"
{
"activators"
{
@@ -1273,7 +1213,7 @@
{
}
}
- "touch_menu_button_18"
+ "touch_menu_button_15"
{
"activators"
{
@@ -1294,7 +1234,7 @@
{
}
}
- "touch_menu_button_19"
+ "touch_menu_button_16"
{
"activators"
{
@@ -1315,10 +1255,69 @@
{
}
}
- }
- "settings"
- {
- "touchmenu_button_fire_type" "0"
+ "touch_menu_button_17"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_18"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_19"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
}
"group"
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360_simple.vdf
similarity index 97%
rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360.vdf
rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360_simple.vdf
index d41448c8..ede54472 100755
--- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360.vdf
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360_simple.vdf
@@ -1134,7 +1134,7 @@
{
"id" "19"
"mode" "radial_menu"
- "name" "dial"
+ "name" "Simple Radial"
"description" ""
"inputs"
{
@@ -1326,7 +1326,7 @@
{
"bindings"
{
- "binding" "key_press F4, F4, RD-F4.png, "
+ "binding" "key_press F8, F8, RD-F8.png, "
}
"settings"
{
@@ -1339,66 +1339,6 @@
}
}
"touch_menu_button_10"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F5, F5, RD-F5.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_11"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F7, F7, RD-F7.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_12"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F8, F8, RD-F8.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_13"
{
"activators"
{
@@ -1418,7 +1358,7 @@
{
}
}
- "touch_menu_button_14"
+ "touch_menu_button_11"
{
"activators"
{
@@ -1439,7 +1379,7 @@
{
}
}
- "touch_menu_button_15"
+ "touch_menu_button_12"
{
"activators"
{
@@ -1460,7 +1400,7 @@
{
}
}
- "touch_menu_button_16"
+ "touch_menu_button_13"
{
"activators"
{
@@ -1481,7 +1421,7 @@
{
}
}
- "touch_menu_button_17"
+ "touch_menu_button_14"
{
"activators"
{
@@ -1502,7 +1442,7 @@
{
}
}
- "touch_menu_button_18"
+ "touch_menu_button_15"
{
"activators"
{
@@ -1523,7 +1463,7 @@
{
}
}
- "touch_menu_button_19"
+ "touch_menu_button_16"
{
"activators"
{
@@ -1544,10 +1484,69 @@
{
}
}
- }
- "settings"
- {
- "touchmenu_button_fire_type" "0"
+ "touch_menu_button_17"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_18"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_19"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
}
"preset"
diff --git a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone.vdf b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone_simple.vdf
similarity index 97%
rename from emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone.vdf
rename to emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone_simple.vdf
index 3899504b..a4464055 100755
--- a/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone.vdf
+++ b/emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xboxone_simple.vdf
@@ -838,7 +838,7 @@
{
"id" "20"
"mode" "radial_menu"
- "name" "Global Radial"
+ "name" "Simple Radial"
"description" ""
"inputs"
{
@@ -1030,7 +1030,7 @@
{
"bindings"
{
- "binding" "key_press F4, F4, RD-F4.png, "
+ "binding" "key_press F8, F8, RD-F8.png, "
}
"settings"
{
@@ -1043,66 +1043,6 @@
}
}
"touch_menu_button_10"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F5, F5, RD-F5.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_11"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F7, F7, RD-F7.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_12"
- {
- "activators"
- {
- "Full_Press"
- {
- "bindings"
- {
- "binding" "key_press F8, F8, RD-F8.png, "
- }
- "settings"
- {
- "haptic_intensity" "2"
- }
- }
- }
- "disabled_activators"
- {
- }
- }
- "touch_menu_button_13"
{
"activators"
{
@@ -1122,7 +1062,7 @@
{
}
}
- "touch_menu_button_14"
+ "touch_menu_button_11"
{
"activators"
{
@@ -1143,7 +1083,7 @@
{
}
}
- "touch_menu_button_15"
+ "touch_menu_button_12"
{
"activators"
{
@@ -1164,7 +1104,7 @@
{
}
}
- "touch_menu_button_16"
+ "touch_menu_button_13"
{
"activators"
{
@@ -1185,7 +1125,7 @@
{
}
}
- "touch_menu_button_17"
+ "touch_menu_button_14"
{
"activators"
{
@@ -1206,7 +1146,7 @@
{
}
}
- "touch_menu_button_18"
+ "touch_menu_button_15"
{
"activators"
{
@@ -1227,7 +1167,7 @@
{
}
}
- "touch_menu_button_19"
+ "touch_menu_button_16"
{
"activators"
{
@@ -1248,10 +1188,69 @@
{
}
}
- }
- "settings"
- {
- "touchmenu_button_fire_type" "0"
+ "touch_menu_button_17"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, ALT + F4, RD-alt-f4.png, "
+ "binding" "key_press F4, ALT + F4, RD-alt-f4.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_18"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ "binding" "key_press X, Wiimote - Sideways Mode, RD-wiimote-side.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
+ "touch_menu_button_19"
+ {
+ "activators"
+ {
+ "Full_Press"
+ {
+ "bindings"
+ {
+ "binding" "key_press LEFT_ALT, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ "binding" "key_press Z, Wiimote - Upright Mode, RD-wiimote-up.png, "
+ }
+ "settings"
+ {
+ "haptic_intensity" "2"
+ }
+ }
+ }
+ "disabled_activators"
+ {
+ }
+ }
}
}
"group"
@@ -1619,3 +1618,4 @@
"right_trackpad_mode" "0"
}
}
+
diff --git a/emu-configs/defaults/retrodeck/helper_files/Install-firmware-through-Ryujinx.txt b/emu-configs/defaults/retrodeck/helper_files/Install-firmware-through-Ryujinx.txt
new file mode 100644
index 00000000..7d196eee
--- /dev/null
+++ b/emu-configs/defaults/retrodeck/helper_files/Install-firmware-through-Ryujinx.txt
@@ -0,0 +1,10 @@
+Do not drop the firmware files here, install them via Ryujinx:
+
+RetroDECK Configurator -> Open Emulator -> Ryujinx -> Tools -> Install Firmware - Select the firmware zipped file
+
+Check the wiki for more information.
+
+Related wiki article can be found here:
+https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/ryujinx/ryujinx-guide/
+
+The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Duckstation-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Duckstation-textures.txt
index 4deee10f..75153575 100644
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Duckstation-textures.txt
+++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Duckstation-textures.txt
@@ -23,6 +23,6 @@ Texture folder directly
- Move textures into the right ~/retrodeck/texture_packs/duckstation/ folder.
Related wiki article can be found here:
-https://github.com/XargonWan/RetroDECK/wiki/Duckstation%3A-Texture-Packs
+https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/duckstation/duckstation-texture-pack/
The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mesen-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mesen-textures.txt
index 33e9d9c8..961ff4a7 100644
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mesen-textures.txt
+++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mesen-textures.txt
@@ -27,6 +27,6 @@ You want apply a texture pack to a game called ScaryCastle USA.nes and you have
NOTE: On the Steam Deck go into GameMode first, then launch RetroDECK.
Related wiki article can be found here:
-https://github.com/XargonWan/RetroDECK/wiki/RetroArch-Mesen%3A-Texture-Packs
+https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/retroarch/retroarch-mesen-texture-pack/
The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mupen64Plus-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mupen64Plus-textures.txt
index 6cfe0670..825751aa 100644
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mupen64Plus-textures.txt
+++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-Mupen64Plus-textures.txt
@@ -25,6 +25,6 @@ For compressed textures stored in .hts files, place them in the 'texture_packs/R
For uncompressed textures stored in loose folders or files, place them in the 'texture_packs/RetroArch-Mupen64Plus/hires_texture/' folder.
Related wiki article can be found here:
-https://github.com/XargonWan/RetroDECK/wiki/RetroArch-Mupen64Plus-Next%3A-Texture-Packs
+https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/retroarch/retroarch-mupen64plus-texture-pack/
The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-PCSX2-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-PCSX2-textures.txt
index 807513b7..ed75e899 100644
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-PCSX2-textures.txt
+++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-PCSX2-textures.txt
@@ -21,6 +21,6 @@ For direct texture folder:
3. Move textures into the correct '~/retrodeck/texture_packs/PCSX2/' folder.
Related wiki article can be found here:
-https://github.com/XargonWan/RetroDECK/wiki/PCSX2%3A-Texture-Packs
+https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/pcsx2/pcsx2-texture-pack/
The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-PPSSPP-textures.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-PPSSPP-textures.txt
index 6fabb0e4..44a6da45 100644
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-PPSSPP-textures.txt
+++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-PPSSPP-textures.txt
@@ -21,6 +21,6 @@ For adding textures:
3. Paste the textures into the correct '~/retrodeck/texture_packs/ppsspp/' folder.
Related wiki article can be found here:
-https://github.com/XargonWan/RetroDECK/wiki/PPSSPP%3A-Texture-Packs
+https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/ppsspp/ppsspp-texture-pack/
The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-citra-mods.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-citra-mods.txt
deleted file mode 100644
index 8918ba2d..00000000
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-citra-mods.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-There are two ways of adding mods into Citra
-
-From Citra
-- Extract any mod from compressed .zip or any other format to folders.
-- Open up Citra inside RetroDECK Configurator by pressing Open Emulator - Citra.
-- Right click on the game you want to add mods into.
-- Click on Open Mods Location.
-- Paste the mod files inside that directory, each folder is stored by the TITLLEID of the game.
-- Quit Citra
-
-From the mod folder directly
-- Extract any mod files from compressed .zip or any other format into folders.
-- Go into ~/retrodeck/mods/citra/. The folders are all named by TITLEID.
-- Past the mods into the right ~/retrodeck/mods/yuzu/ folder.
-
-Related wiki article can be found here:
-https://github.com/XargonWan/RetroDECK/wiki/Citra%3A-Mods#citra---3ds
-
-The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-custom-emulators.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-custom-emulators.txt
deleted file mode 100644
index 2c35cf4a..00000000
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-custom-emulators.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-There is the possibility to provide custom emutlators provided by the user.
-
-At the moment the only one available is Yuzu.
-Place your custom Yuzu files (AppImage and such) in the custom/yuzu folder without any other subfolders, like in the example:
-retrodeck/customs/yuzu/yuzu*.AppImage
-
-WARNINGS on custom emulators:
-- Custom emulators are self managed: means that RetroDECK Team is not supporting nor troubleshooting them.
-- Custom emulators could potentially break other included emulators configs: use them at your own risk.
-- Remember to make the binary executable, otherwise they won't be launched.
-- Hotkeys might not be working if not configured by the users.
-
-Related wiki article can be found here:
----
-
-The RetroDECK Team
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-dolphin-mods.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-dolphin-mods.txt
index 33a50c8c..a9b96bc5 100644
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-dolphin-mods.txt
+++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-dolphin-mods.txt
@@ -14,6 +14,6 @@ Notes:
- GAME_ID is different for every game.
Related wiki article can be found here:
-https://github.com/XargonWan/RetroDECK/wiki/Dolphin-and-Primehack%3A-Mods
+https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/dolphin-primehack/dolphin-primehack-mod/
The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-primehack-mods.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-primehack-mods.txt
index 1bcbbc05..8d3650e9 100644
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-primehack-mods.txt
+++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-primehack-mods.txt
@@ -14,6 +14,6 @@ Notes:
- GAME_ID is different for every game.
Related wiki article can be found here:
-https://github.com/XargonWan/RetroDECK/wiki/Dolphin-and-Primehack%3A-Mods
+https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/dolphin-primehack/dolphin-primehack-mod/
The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-psvita-games.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-psvita-games.txt
index febbde78..e51a66b5 100644
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-psvita-games.txt
+++ b/emu-configs/defaults/retrodeck/helper_files/how-to-install-psvita-games.txt
@@ -17,6 +17,6 @@ For example the game `WipEout 2048 (EU)` has an ID that is `PCSF00007`.
So simply add `PCSF00007` to the `WipEout 2048 (EU).psvita` file and the setup for this game is complete.
Related wiki article can be found here:
---
+https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/vita3k/vita3k-guide/
The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/helper_files/how-to-install-yuzu-mods.txt b/emu-configs/defaults/retrodeck/helper_files/how-to-install-yuzu-mods.txt
deleted file mode 100644
index 1f41c698..00000000
--- a/emu-configs/defaults/retrodeck/helper_files/how-to-install-yuzu-mods.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-There are two ways of adding mods into Yuzu
-
-From Yuzu directly
-- Extract any mod files from compressed .zip or any other format to folders.
-- Open up Yuzu inside RetroDECK Configurator by pressing Open Emulator - Yuzu.
-- Right click on the game you want to add mods into.
-- Click on Open Mod Data Destination.
-- Paste the mod folders inside that directory.
-- Right clicking on the game and selecting Properties.
-- Enable the mods you want to enable by pressing the checkboxes in the Add-Ons tab and press OK.
-- Quit Yuzu
-
-From the mods/yuzu folder
-- Extract any mod files from compressed .zip or any other format into folders.
-- Go into ~/retrodeck/mods/yuzu/ and file the right folder for the game you want to add mods to. The folders are all named by TITLEID.
-- Move those folders into ~/retrodeck/mods/yuzu/
-- Open up Yuzu inside RetroDECK Configurator by pressing Open Emulator - Yuzu.
-- Right clicking on the game and selecting Properties.
-- Enable the mods you want to enable by pressing the checkboxes in the Add-Ons tab and press OK.
-- Quit Yuzu
-
-Related wiki article can be found here:
-https://github.com/XargonWan/RetroDECK/wiki/Yuzu%3A-Mods
-
-The RetroDECK Team
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/presets/gb_presets.cfg b/emu-configs/defaults/retrodeck/presets/gb_presets.cfg
index d754c374..5c61c27b 100644
--- a/emu-configs/defaults/retrodeck/presets/gb_presets.cfg
+++ b/emu-configs/defaults/retrodeck/presets/gb_presets.cfg
@@ -10,3 +10,4 @@ change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Gambatte/
change^borders^input_overlay_scale_landscape^1.205000^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^input_overlay_y_offset_landscape^0.005000^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
enable^abxy_button_swap^/var/config/retroarch/config/remaps/Gambatte/gb.rmp
+change^rewind^rewind_enable^true^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
diff --git a/emu-configs/defaults/retrodeck/presets/gba_presets.cfg b/emu-configs/defaults/retrodeck/presets/gba_presets.cfg
index b5a4fc03..7f4d649e 100644
--- a/emu-configs/defaults/retrodeck/presets/gba_presets.cfg
+++ b/emu-configs/defaults/retrodeck/presets/gba_presets.cfg
@@ -4,9 +4,10 @@ change^borders^custom_viewport_height^640^^/var/config/retroarch/config/mGBA/gba
change^borders^custom_viewport_width^960^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^custom_viewport_x^160^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^custom_viewport_y^0^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
-change^borders^input_overlay_enable^true^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gba.cfg^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^input_overlay_aspect_adjust_landscape^0.110000^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
+change^borders^input_overlay_enable^true^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^input_overlay_scale_landscape^1.2150000^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^input_overlay_y_offset_landscape^0.020000^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
-enable^abxy_button_swap^/var/config/retroarch/config/remaps/Gambatte/gbc.rmp
+enable^abxy_button_swap^/var/config/retroarch/config/remaps/mGBA/gba.rmp
+change^rewind^rewind_enable^true^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
diff --git a/emu-configs/defaults/retrodeck/presets/gbc_presets.cfg b/emu-configs/defaults/retrodeck/presets/gbc_presets.cfg
index d6b2e107..4580722e 100644
--- a/emu-configs/defaults/retrodeck/presets/gbc_presets.cfg
+++ b/emu-configs/defaults/retrodeck/presets/gbc_presets.cfg
@@ -10,3 +10,4 @@ change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Gambatte/
change^borders^input_overlay_scale_landscape^1.205000^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^input_overlay_y_offset_landscape^-0.040000^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
enable^abxy_button_swap^/var/config/retroarch/config/remaps/Gambatte/gbc.rmp
+change^rewind^rewind_enable^true^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
diff --git a/emu-configs/defaults/retrodeck/presets/genesis_presets.cfg b/emu-configs/defaults/retrodeck/presets/genesis_presets.cfg
index c566decf..59fccbf8 100644
--- a/emu-configs/defaults/retrodeck/presets/genesis_presets.cfg
+++ b/emu-configs/defaults/retrodeck/presets/genesis_presets.cfg
@@ -4,3 +4,4 @@ change^borders^input_overlay_aspect_adjust_landscape^0.100000^^/var/config/retro
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^input_overlay_scale_landscape^1.040000^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg
change^widescreen^aspect_ratio_index^24^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg
+change^rewind^rewind_enable^true^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg
diff --git a/emu-configs/defaults/retrodeck/presets/gg_presets.cfg b/emu-configs/defaults/retrodeck/presets/gg_presets.cfg
index 2de18ce3..c2b58364 100644
--- a/emu-configs/defaults/retrodeck/presets/gg_presets.cfg
+++ b/emu-configs/defaults/retrodeck/presets/gg_presets.cfg
@@ -9,3 +9,4 @@ change^borders^input_overlay_aspect_adjust_landscape^0.110000^^/var/config/retro
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^input_overlay_scale_landscape^1.350000^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
change^borders^input_overlay_y_offset_landscape^0.020000^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
+change^rewind^rewind_enable^true^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
diff --git a/emu-configs/defaults/retrodeck/presets/retroarch_presets.cfg b/emu-configs/defaults/retrodeck/presets/retroarch_presets.cfg
index 4d8c268e..2cbc3596 100644
--- a/emu-configs/defaults/retrodeck/presets/retroarch_presets.cfg
+++ b/emu-configs/defaults/retrodeck/presets/retroarch_presets.cfg
@@ -3,5 +3,5 @@ change^cheevos^cheevos_enable^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
change^cheevos^cheevos_token^$cheevos_token^^$raconf^$emuconfigs/retroarch/retroarch.cfg
change^cheevos^cheevos_username^$cheevos_username^^$raconf^$emuconfigs/retroarch/retroarch.cfg
change^cheevos_hardcore^cheevos_hardcore_mode_enable^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
-change^savestate_auto_load^savestate_auto_load^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
-change^savestate_auto_save^savestate_auto_save^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
+change^quick_resume^savestate_auto_load^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
+change^quick_resume^savestate_auto_save^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
diff --git a/emu-configs/defaults/retrodeck/presets/snes_presets.cfg b/emu-configs/defaults/retrodeck/presets/snes_presets.cfg
index 06ce7b18..99825095 100644
--- a/emu-configs/defaults/retrodeck/presets/snes_presets.cfg
+++ b/emu-configs/defaults/retrodeck/presets/snes_presets.cfg
@@ -5,3 +5,4 @@ change^borders^input_overlay_scale_landscape^1.050000^^/var/config/retroarch/con
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg
change^widescreen^aspect_ratio_index^24^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg
enable^abxy_button_swap^/var/config/retroarch/config/remaps/Snes9x/snes.rmp
+change^rewind^rewind_enable^true^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg
diff --git a/emu-configs/defaults/retrodeck/reference_lists/bios_checklist.cfg b/emu-configs/defaults/retrodeck/reference_lists/bios_checklist.cfg
index c11d6a4c..a775d8bc 100644
--- a/emu-configs/defaults/retrodeck/reference_lists/bios_checklist.cfg
+++ b/emu-configs/defaults/retrodeck/reference_lists/bios_checklist.cfg
@@ -1,14 +1,27 @@
-neogeo.zip^^Unknown^Arcade (FinalBurn Neo)^Neo Geo BIOS (Required for this system)
-neocdz.zip^^Unknown^Arcade (FinalBurn Neo)^Neo Geo CDZ BIOS (Required for this system)
-decocass.zip^^Unknown^Arcade (FinalBurn Neo)^DECO Cassette System BIOS (Required for this system)
-isgsm.zip^^Unknown^Arcade (FinalBurn Neo)^ISG Selection Master Type 2006 System BIOS (Required for this system)
-midssio.zip^^Unknown^Arcade (FinalBurn Neo)^Midway SSIO Sound Board Internal ROM (Required for this system)
-nmk004.zip^^Unknown^Arcade (FinalBurn Neo)^NMK004 Internal ROM (Required for this system)
-pgm.zip^^Unknown^Arcade (FinalBurn Neo)^PGM System BIOS (Required for this system)
-skns.zip^^Unknown^Arcade (FinalBurn Neo)^Super Kaneko Nova System BIOS (Required for this system)
-ym2608.zip^^Unknown^Arcade (FinalBurn Neo)^YM2608 Internal ROM (Required for this system)
-cchip.zip^^Unknown^Arcade (FinalBurn Neo)^C-Chip Internal ROM (Required for this system)
-bubsys.zip^^Unknown^Arcade (FinalBurn Neo)^Bubble System BIOS (Required for this system)
+panafz1.bin^^f47264dd47fe30f73ab3c010015c155b^3DO^Panasonic FZ-1
+panafz10.bin^^51f2f43ae2f3508a14d9f56597e2d3ce^3DO^Panasonic FZ-10
+panafz10-norsa.bin^^1477bda80dc33731a65468c1f5bcbee9^3DO^Panasonic FZ-10 [RSA Patch]
+panafz10e-anvil.bin^^a48e6746bd7edec0f40cff078f0bb19f^3DO^Panasonic FZ-10-E [Anvil]
+panafz10e-anvil-norsa.bin^^cf11bbb5a16d7af9875cca9de9a15e09^3DO^Panasonic FZ-10-E [Anvil RSA Patch]
+panafz1j.bin^^a496cfdded3da562759be3561317b605^3DO^Panasonic FZ-1J
+panafz1j-norsa.bin^^f6c71de7470d16abe4f71b1444883dc8^3DO^Panasonic FZ-1J [RSA Patch]
+goldstar.bin^^8639fd5e549bd6238cfee79e3e749114^3DO^Goldstar GDO-101M
+sanyotry.bin^^35fa1a1ebaaeea286dc5cd15487c13ea^3DO^Sanyo IMP-21J TRY
+3do_arcade_saot.bin^^8970fc987ab89a7f64da9f8a8c4333ff^3DO^Shootout At Old Tucson
+panafz1-kanji.bin^^b8dc97f778a6245c58e064b0312e8281^3DO^Panasonic FZ-1 Kanji ROM (Font ROM: required for some Japanese games. Optional otherwise.)
+panafz10ja-anvil-kanji.bin^^428577250f43edc902ea239c50d2240d^3DO^Panasonic FZ-10JA Kanji ROM (Font ROM: required for some Japanese games. Optional otherwise.)
+panafz1j-kanji.bin^^c23fb5d5e6bb1c240d02cf968972be37^3DO^Panasonic FZ-1J Kanji ROM (Font ROM: required for some Japanese games. Optional otherwise.)
+neogeo.zip^^00dad01abdbf8ea9e79ad2fe11bdb182^Arcade (FinalBurn Neo)^Neo Geo BIOS (Required for this system)
+neocdz.zip^^c733b4b7bd30fa849874d96c591c8639^Arcade (FinalBurn Neo)^Neo Geo CDZ BIOS (Required for this system)
+decocass.zip^^b7e1189b341bf6a8e270017c096d21b0^Arcade (FinalBurn Neo)^DECO Cassette System BIOS (Required for this system)
+isgsm.zip^^4a56d56e2219c5e2b006b66a4263c01c^Arcade (FinalBurn Neo)^ISG Selection Master Type 2006 System BIOS (Required for this system)
+midssio.zip^^5904b0de768d1d506e766aa7e18994c1^Arcade (FinalBurn Neo)^Midway SSIO Sound Board Internal ROM (Required for this system)
+nmk004.zip^^bfacf1a68792d5348f93cf724d2f1dda^Arcade (FinalBurn Neo)^NMK004 Internal ROM (Required for this system)
+pgm.zip^^87cc944eef4c671aa2629a8ba48a08e0^Arcade (FinalBurn Neo)^PGM System BIOS (Required for this system)
+skns.zip^^3f956c4e7008804cb47cbde49bd5b908^Arcade (FinalBurn Neo)^Super Kaneko Nova System BIOS (Required for this system)
+ym2608.zip^^79ae0d2bb1901b7e606b6dc339b79a97^Arcade (FinalBurn Neo)^YM2608 Internal ROM (Required for this system)
+cchip.zip^^df6f8a3d83c028a5cb9f2f2be60773f3^Arcade (FinalBurn Neo)^C-Chip Internal ROM (Required for this system)
+bubsys.zip^^f81298afd68a1a24a49a1a2d9f087964^Arcade (FinalBurn Neo)^Bubble System BIOS (Required for this system)
namcoc69.zip^^Unknown^Arcade (FinalBurn Neo)^Namco C69 BIOS (Required for this system)
namcoc70.zip^^Unknown^Arcade (FinalBurn Neo)^Namco C70 BIOS (Required for this system)
namcoc75.zip^^Unknown^Arcade (FinalBurn Neo)^Namco C75 BIOS (Required for this system)
@@ -48,9 +61,9 @@ Complex.bin^^Unknown^Microsoft XBOX^Used by XEMU emulator
Complex_4627v1.03.bin^^Unknown^Microsoft XBOX^Used by XEMU emulator
Complex_4627.bin^^Unknown^Microsoft XBOX^Used by XEMU emulator
syscard3.pce^^38179df8f4ac870017db21ebcbf53114^NEC PC Engine / CD^Super CD-ROM2 System V3.xx (Required)
-syscard2.pce^^Unknown^NEC PC Engine / CD^CD-ROM System V2.xx
-syscard1.pce^^Unknown^NEC PC Engine / CD^CD-ROM System V1.xx
-gexpress.pce^^Unknown^NEC PC Engine / CD^Game Express CD Card
+syscard2.pce^^3cdd6614a918616bfc41c862e889dd79^NEC PC Engine / CD^CD-ROM System V2.xx
+syscard1.pce^^2b7ccb3d86baa18f6402c176f3065082^NEC PC Engine / CD^CD-ROM System V1.xx
+gexpress.pce^^6d2cb14fc3e1f65ceb135633d1694122^NEC PC Engine / CD^Game Express CD Card
font.bmp^np2kai/^7da1e5b7c482d4108d22a5b09631d967^NEC PC-98 (Neko Project II Kai)^Needed to display text (Required)
FONT.ROM^np2kai/^2af6179d7de4893ea0b705c00e9a98d6^NEC PC-98 (Neko Project II Kai)^Alt font file (Required if normal font file is missing)
bios.rom^np2kai/^e246140dec5124c5e404869a84caefce^NEC PC-98 (Neko Project II Kai)^BIOS file (Required)
@@ -58,12 +71,12 @@ itf.rom^np2kai/^e9fc3890963b12cf15d0a2eea5815b72^NEC PC-98 (Neko Project II Kai)
sound.rom^np2kai/^caf90f22197aed6f14c471c21e64658d^NEC PC-98 (Neko Project II Kai)^BIOS file (Required)
bios9821.rom^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^Optional BIOS file
d8000.rom^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^Optional BIOS file
-2608_BD.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
-2608_SD.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
-2608_TOP.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
-2608_HH.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
-2608_TOM.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
-2608_RIM.WAV^np2kai/^Unknown^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
+2608_BD.WAV^np2kai/^d94546e70f17fd899be8df3544ab6cbb^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
+2608_SD.WAV^np2kai/^d71004351c8bbfdad53b18222c061d49^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
+2608_TOP.WAV^np2kai/^593cff6597ab9380d822b8f824fd2c28^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
+2608_HH.WAV^np2kai/^08c54a0c1f774a5538a848a6665a34b4^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
+2608_TOM.WAV^np2kai/^96a4ead13f364734f79b0c58af2f0e1f^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
+2608_RIM.WAV^np2kai/^465ea0768b27da404aec45dfc501404b^NEC PC-98 (Neko Project II Kai)^YM2608 RYTHM sample
n88.rom^^4f984e04a99d56c4cfe36115415d6eb8^NEC PC-8000 / PC-8800 series (QUASI88)^BIOS File (Required)
n88n.rom^^2ff07b8769367321128e03924af668a0^NEC PC-8000 / PC-8800 series (QUASI88)^Required for PC-8000 series emulation. (N BASIC mode)
disk.rom^^793f86784e5608352a5d7f03f03e0858^NEC PC-8000 / PC-8800 series (QUASI88)^Required for loading disk images
@@ -72,14 +85,27 @@ n88_0.rom^^d675a2ca186c6efcd6277b835de4c7e5^NEC PC-8000 / PC-8800 series (QUASI8
n88_1.rom^^e844534dfe5744b381444dbe61ef1b66^NEC PC-8000 / PC-8800 series (QUASI88)^Optional BIOS file
n88_2.rom^^6548fa45061274dee1ea8ae1e9e93910^NEC PC-8000 / PC-8800 series (QUASI88)^Optional BIOS file
n88_3.rom^^fc4b76a402ba501e6ba6de4b3e8b4273^NEC PC-8000 / PC-8800 series (QUASI88)^Optional BIOS file
+neocd_f.rom^^8834880c33164ccbe6476b559f3e37de^Neo Geo CD^Front Loader BIOS (At least 1 required)
+neocd_sf.rom^^043d76d5f0ef836500700c34faef774d^Neo Geo CD^Front Loader BIOS (SMKDAN 0.7b DEC 2010) (At least 1 required)
+neocd_t.rom^^de3cf45d227ad44645b22aa83b49f450^Neo Geo CD^Top Loader BIOS (At least 1 required)
+neocd_st.rom^^f6325a33c6d63ea4b9162a3fa8c32727^Neo Geo CD^Top Loader BIOS (SMKDAN 0.7b DEC 2010) (At least 1 required)
+neocd_z.rom^^11526d58d4c524daef7d5d677dc6b004^Neo Geo CD^CDZ BIOS (At least 1 required)
+neocd_sz.rom^^971ee8a36fb72da57aed01758f0a37f5^Neo Geo CD^CDZ BIOS (SMKDAN 0.7b DEC 2010) (At least 1 required)
+front-sp1.bin^^5c2366f25ff92d71788468ca492ebeca^Neo Geo CD^Front Loader BIOS (MAME) (At least 1 required)
+top-sp1.bin^^122aee210324c72e8a11116e6ef9c0d0^Neo Geo CD^Top Loader BIOS (MAME) (At least 1 required)
+neocd.bin^^f39572af7584cb5b3f70ae8cc848aba2^Neo Geo CD^CDZ BIOS (MAME) (At least 1 required)
+uni-bioscd.rom^^08ca8b2dba6662e8024f9e789711c6fc^Neo Geo CD^Universe BIOS CD 3.3
+gb_bios.bin^^32fbbd84168d3482956eb3c5051637f5^Game Boy^Optional BIOS file (used to display the Nintendo logo at boot)
+gbc_bios.bin^^dbfce9db9deaa2567f6a84fde55f9680^Game Boy Color^Optional BIOS file (used to display the Nintendo logo at boot)
+gba_bios.bin^^a860e8c0b6d573d191e4ec7db1b1e4f6^Game Boy Advance^Optional BIOS file (used to display the Nintendo logo at boot)
aes_keys.txt^citra/sysdata/^Unknown^Nintendo 3DS^Decryption keys used by Citra emulator
bios7.bin^^df692a80a5b1bc90728bc3dfc76cd948^Nintendo DS^Used by MelonDS emulator (Required, see Wiki)
bios9.bin^^a392174eb3e572fed6447e956bde4b25^Nintendo DS^Used by MelonDS emulator (Required, see Wiki)
firmware.bin^^e45033d9b0fa6b0de071292bba7c9d13^Nintendo DS^Used by MelonDS emulator (Required, see Wiki)
disksys.rom^^ca30b50f880eb660a320674ed365ef7a^Nintendo NES / Famicom^Family Computer Disk System BIOS - Required for Family Computer Disk System emulation
bios.min^^1e4fb124a3a886865acb574f388c803d^Nintendo Pokemon Mini^Pokémon Mini BIOS - Optional
-prod.keys^switch/keys/^Unknown^Nintendo Switch^A file for Switch emulation in Yuzu (Required)
-title.keys^switch/keys/^Unknown^Nintendo Switch^A file for Switch emulation in Yuzu (Required)
+prod.keys^switch/keys/^Unknown^Nintendo Switch^A file for Switch emulation in Ryujinx (Required)
+title.keys^switch/keys/^Unknown^Nintendo Switch^A file for Switch emulation in Ryujinx (Required)
pico8^pico-8/^Unknown^PICO-8^The PICO-8 executable (Required)
pico8.dat^pico-8/^Unknown^PICO-8^A PICO-8 system file (Required)
pico8_dyn^pico-8/^Unknown^PICO-8^A PICO-8 system file (Required)
@@ -103,9 +129,9 @@ mpr-18811-mx.ic1^^255113ba943c92a54facd25a10fd780c^Sega Saturn^The King of Fight
mpr-19367-mx.ic1^^1cd19988d1d72a3e7caa0b73234c96b4^Sega Saturn^Ultraman: Hikari no Kyojin Densetsu ROM Cartridge (Required for this game)
iplrom.dat^keropi/^7fd4caabac1d9169e289f0f7bbf71d8e^Sharp X68000^X68000 BIOS (Required)
cgrom.dat^keropi/^cb0a5cfcf7247a7eab74bb2716260269^Sharp X68000^Font file (Required)
-iplrom30.dat^keropi/^Unknown^Sharp X68000^X68000 BIOS 2
-iplromco.dat^keropi/^Unknown^Sharp X68000^X68000 BIOS 3
-iplromxv.dat^keropi/^Unknown^Sharp X68000^X68000 BIOS 4
+iplrom30.dat^keropi/^f373003710ab4322642f527f567e020a^Sharp X68000^X68000 BIOS 2
+iplromco.dat^keropi/^cc78d4f4900f622bd6de1aed7f52592f^Sharp X68000^X68000 BIOS 3
+iplromxv.dat^keropi/^0617321daa182c3f3d6f41fd02fb3275^Sharp X68000^X68000 BIOS 4
psxonpsp660.bin^^c53ca5908936d412331790f4426c6c33^Sony PSX^PS1 BIOS (At least 1 required)
scph5500.bin^^8dd7d5296a650fac7319bce665a6a53c^Sony PSX^PS1 JP BIOS (At least 1 required)
scph5501.bin^^490f666e1afb15b7362b406ed1cea246^Sony PSX^PS1 US BIOS (At least 1 required)
@@ -119,11 +145,11 @@ ps1_rom.bin^^81bbe60ba7a3d1cea1d48c14cbcc647b^Sony PSX^PS1 BIOS (At least 1 requ
ps2-0200a-20040614.bin^^d333558cc14561c1fdc334c75d5f37b7^Sony PS2^PS2 US BIOS (At least 1 required)
ps2-0200e-20040614.bin^^dc752f160044f2ed5fc1f4964db2a095^Sony PS2^PS2 EU BIOS (At least 1 required)
ps2-0200j-20040614.bin^^0eee5d1c779aa50e94edd168b4ebf42e^Sony PS2^PS2 JP BIOS (At least 1 required)
-128p-0.rom^fuse/^Unknown^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required)
-128p-1.rom^fuse/^Unknown^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required)
-trdos.rom^fuse/^Unknown^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required)
-gluck.rom^fuse/^Unknown^ZX Spectrum^Pentagon 512K/1024 ROM (Required)
-256s-0.rom^fuse/^Unknown^ZX Spectrum^Scorpion 256K ROM (Required)
-256s-1.rom^fuse/^Unknown^ZX Spectrum^Scorpion 256K ROM (Required)
-256s-2.rom^fuse/^Unknown^ZX Spectrum^Scorpion 256K ROM (Required)
-256s-3.rom^fuse/^Unknown^ZX Spectrum^Scorpion 256K ROM (Required)
+128p-0.rom^fuse/^a249565f03b98d004ee7f019570069cd^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required)
+128p-1.rom^fuse/^6e09e5d3c4aef166601669feaaadc01c^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required)
+trdos.rom^fuse/^0da70a5d2a0e733398e005b96b7e4ba6^ZX Spectrum^Pentagon 128K/512K/1024 ROM (Required)
+gluck.rom^fuse/^d5869034604dbfd2c1d54170e874fd0a^ZX Spectrum^Pentagon 512K/1024 ROM (Required)
+256s-0.rom^fuse/^b9fda5b6a747ff037365b0e2d8c4379a^ZX Spectrum^Scorpion 256K ROM (Required)
+256s-1.rom^fuse/^643861ad34831b255bf2eb64e8b6ecb8^ZX Spectrum^Scorpion 256K ROM (Required)
+256s-2.rom^fuse/^d8ad507b1c915a9acfe0d73957082926^ZX Spectrum^Scorpion 256K ROM (Required)
+256s-3.rom^fuse/^ce0723f9bc02f4948c15d3b3230ae831^ZX Spectrum^Scorpion 256K ROM (Required)
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg b/emu-configs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg
index 140620f4..e70139e3 100644
--- a/emu-configs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg
+++ b/emu-configs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg
@@ -1,5 +1,6 @@
1201^1231^0000^2359^rd-xmas-splash.svg
0209^0212^0000^2359^rd-lunar-dragon-splash.svg
0214^0214^0001^2359^rd-valentines-splash.svg
+0304^0304^0000^2359^rd-gm-bday-splash.svg
0317^0317^0000^2359^rd-stpatricks-splash.svg
0429^0505^0000^2359^rd-kodomo-golden.svg
diff --git a/emu-configs/defaults/retrodeck/reference_lists/finit_options_list.cfg b/emu-configs/defaults/retrodeck/reference_lists/finit_options_list.cfg
index 0c1eb4f1..fdf9f19b 100644
--- a/emu-configs/defaults/retrodeck/reference_lists/finit_options_list.cfg
+++ b/emu-configs/defaults/retrodeck/reference_lists/finit_options_list.cfg
@@ -1,2 +1,3 @@
+true^RetroDECK Steam Controller Profiles Install^Install RetroDECK Steam Input profiles to Steam - Recommended^rd_controller_profile
false^RPCS3 Firmware Install^Install firmware needed for PS3 emulation^rpcs3_firmware
-false^RetroDECK Controller Profile^Install custom RetroDECK controller profile^rd_controller_profile
+false^Vita3K Firmware Install^Install firmware needed for Vita3K emulation^vita3k_firmware
diff --git a/emu-configs/defaults/retrodeck/reference_lists/helper_files_list.cfg b/emu-configs/defaults/retrodeck/reference_lists/helper_files_list.cfg
index 8a3b9744..10630974 100644
--- a/emu-configs/defaults/retrodeck/reference_lists/helper_files_list.cfg
+++ b/emu-configs/defaults/retrodeck/reference_lists/helper_files_list.cfg
@@ -4,10 +4,8 @@
# The FILE name can have spaces in it, but the DESTINATION cannot, even in variable form
# mods
-how-to-install-citra-mods.txt^$mods_folder/Citra
how-to-install-dolphin-mods.txt^$mods_folder/Dolphin
how-to-install-primehack-mods.txt^$mods_folder/Primehack
-how-to-install-yuzu-mods.txt^$mods_folder/Yuzu
# textures
how-to-install-Mesen-textures.txt^$texture_packs_folder/RetroArch-Mesen
@@ -17,8 +15,6 @@ how-to-install-Mupen64Plus-textures.txt^$texture_packs_folder/RetroArch-Mupen64P
how-to-install-Mupen64Plus-textures.txt^$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture
how-to-install-Duckstation-textures.txt^$texture_packs_folder/Duckstation
-# customs
-how-to-install-custom-emulators.txt^$rdhome/customs
-
# emulators
how-to-install-psvita-games.txt^$roms_folder/psvita
+Install-firmware-through-Ryujinx.txt^$bios_folder/switch/firmware
diff --git a/emu-configs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg b/emu-configs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg
index d9c786d8..f717c3b0 100644
--- a/emu-configs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg
+++ b/emu-configs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg
@@ -1,5 +1,4 @@
Cemu
-citra-emu
dolphin-emu
duckstation
melonDS
@@ -10,3 +9,4 @@ rpcs3
Ryujinx
xemu
yuzu
+citra-emu
diff --git a/emu-configs/defaults/retrodeck/reference_lists/pretty_system_names.cfg b/emu-configs/defaults/retrodeck/reference_lists/pretty_system_names.cfg
index f324a56d..e668911a 100644
--- a/emu-configs/defaults/retrodeck/reference_lists/pretty_system_names.cfg
+++ b/emu-configs/defaults/retrodeck/reference_lists/pretty_system_names.cfg
@@ -1,4 +1,3 @@
-citra^Citra (Nintendo 3DS Standalone Emulator)
dolphin^Dolphin (GameCube / Wii Standalone Emulator)
duckstation^Duckstation (Sony Playstation Standalone Emulator)
gb^Nintendo GameBoy
@@ -14,4 +13,5 @@ psx_ra^Sony Playstation (RetroArch Core)
retroarch^RetroArch (Multi-emulator Frontend)
ryujinx^Ryujinx (Nintendo Switch Standalone Emulator)
snes^Nintendo Super Nintendo
-yuzu^Yuzu (Nintendo Switch Standalone Emulator)
+yuzu^Yuzu (Nintendo Switch Standalone Emulator, via Ponzu)
+citra^Citra (Nintendo 3DS Standalone Emulator, via Ponzu)
\ No newline at end of file
diff --git a/emu-configs/defaults/retrodeck/retrodeck.cfg b/emu-configs/defaults/retrodeck/retrodeck.cfg
index 5cf0a8f2..88a33896 100644
--- a/emu-configs/defaults/retrodeck/retrodeck.cfg
+++ b/emu-configs/defaults/retrodeck/retrodeck.cfg
@@ -6,8 +6,8 @@ roms_folder=/home/deck/retrodeck/roms
saves_folder=/home/deck/retrodeck/saves
states_folder=/home/deck/retrodeck/states
bios_folder=/home/deck/retrodeck/bios
-media_folder=/home/deck/retrodeck/downloaded_media
-themes_folder=/home/deck/retrodeck/themes
+media_folder=/home/deck/retrodeck/ES-DE/downloaded_media
+themes_folder=/home/deck/retrodeck/ES-DE/themes
logs_folder=/home/deck/retrodeck/logs
screenshots_folder=/home/deck/retrodeck/screenshots
mods_folder=/home/deck/retrodeck/mods
@@ -28,6 +28,8 @@ multi_user_mode=false
ask_default_user=true
default_user=
developer_options=false
+kiroi_ponzu=false
+akai_ponzu=false
[cheevos]
duckstation=false
@@ -39,6 +41,14 @@ duckstation=false
pcsx2=false
retroarch=false
+[rewind]
+gb=false
+gba=false
+gbc=false
+genesis=false
+gg=false
+snes=false
+
[borders]
gb=false
gba=false
@@ -56,27 +66,20 @@ psx_ra=false
snes=false
[abxy_button_swap]
-citra=false
gb=false
gba=false
gbc=false
n64=false
snes=false
-yuzu=false
+citra=false
-[savestate_auto_load]
-ppsspp=true
-retroarch=true
-
-[savestate_auto_save]
-duckstation=true
-pcsx2=true
+[quick_resume]
retroarch=true
[ask_to_exit]
-citra=false
dolphin=false
duckstation=false
pcsx2=false
primehack=false
-yuzu=false
+citra=false
+rpcs3=false
diff --git a/emu-configs/defaults/yuzu/qt-config.ini b/emu-configs/defaults/yuzu/qt-config.ini
index 5a18ed8a..36b5f350 100644
--- a/emu-configs/defaults/yuzu/qt-config.ini
+++ b/emu-configs/defaults/yuzu/qt-config.ini
@@ -89,60 +89,60 @@ player_0_body_color_left=4278893030
player_0_body_color_left\default=false
player_0_body_color_right=4294917160
player_0_body_color_right\default=false
-player_0_button_a="toggle:0,code:67,engine:keyboard"
-player_0_button_a\default=true
-player_0_button_b="toggle:0,code:88,engine:keyboard"
-player_0_button_b\default=true
+player_0_button_a="button:1,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_a\default=false
+player_0_button_b="button:0,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_b\default=false
player_0_button_color_left=4278197790
player_0_button_color_left\default=false
player_0_button_color_right=4280158730
player_0_button_color_right\default=false
-player_0_button_ddown="toggle:0,code:16777237,engine:keyboard"
-player_0_button_ddown\default=true
-player_0_button_dleft="toggle:0,code:16777234,engine:keyboard"
-player_0_button_dleft\default=true
-player_0_button_dright="toggle:0,code:16777236,engine:keyboard"
-player_0_button_dright\default=true
-player_0_button_dup="toggle:0,code:16777235,engine:keyboard"
-player_0_button_dup\default=true
-player_0_button_home="toggle:0,code:0,engine:keyboard"
-player_0_button_home\default=true
-player_0_button_l="toggle:0,code:81,engine:keyboard"
-player_0_button_l\default=true
-player_0_button_lstick="toggle:0,code:70,engine:keyboard"
-player_0_button_lstick\default=true
-player_0_button_minus="toggle:0,code:78,engine:keyboard"
-player_0_button_minus\default=true
-player_0_button_plus="toggle:0,code:77,engine:keyboard"
-player_0_button_plus\default=true
-player_0_button_r="toggle:0,code:69,engine:keyboard"
-player_0_button_r\default=true
-player_0_button_rstick="toggle:0,code:71,engine:keyboard"
-player_0_button_rstick\default=true
-player_0_button_screenshot="toggle:0,code:0,engine:keyboard"
-player_0_button_screenshot\default=true
-player_0_button_sl="toggle:0,code:81,engine:keyboard"
-player_0_button_sl\default=true
-player_0_button_sr="toggle:0,code:69,engine:keyboard"
-player_0_button_sr\default=true
-player_0_button_x="toggle:0,code:86,engine:keyboard"
-player_0_button_x\default=true
-player_0_button_y="toggle:0,code:90,engine:keyboard"
-player_0_button_y\default=true
-player_0_button_zl="toggle:0,code:82,engine:keyboard"
-player_0_button_zl\default=true
-player_0_button_zr="toggle:0,code:84,engine:keyboard"
-player_0_button_zr\default=true
+player_0_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_ddown\default=false
+player_0_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_dleft\default=false
+player_0_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_dright\default=false
+player_0_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_dup\default=false
+player_0_button_home="button:8,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_home\default=false
+player_0_button_l="button:4,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_l\default=false
+player_0_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_lstick\default=false
+player_0_button_minus="button:6,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_minus\default=false
+player_0_button_plus="button:7,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_plus\default=false
+player_0_button_r="button:5,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_r\default=false
+player_0_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_rstick\default=false
+player_0_button_screenshot=[empty]
+player_0_button_screenshot\default=false
+player_0_button_sl="button:4,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_sl\default=false
+player_0_button_sr="button:5,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_sr\default=false
+player_0_button_x="button:3,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_x\default=false
+player_0_button_y="button:2,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_y\default=false
+player_0_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:0,invert:+,engine:sdl"
+player_0_button_zl\default=false
+player_0_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:0,invert:+,engine:sdl"
+player_0_button_zr\default=false
player_0_connected=true
player_0_connected\default=true
-player_0_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button"
-player_0_lstick\default=true
-player_0_motionleft="toggle:0,code:55,engine:keyboard"
-player_0_motionleft\default=true
-player_0_motionright="toggle:0,code:56,engine:keyboard"
-player_0_motionright\default=true
-player_0_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button"
-player_0_rstick\default=true
+player_0_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_lstick\default=false
+player_0_motionleft="motion:0,pad:0,port:26760,guid:0000000000000000000000007f000001,engine:cemuhookudp"
+player_0_motionleft\default=false
+player_0_motionright=[empty]
+player_0_motionright\default=false
+player_0_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_rstick\default=false
player_0_type=0
player_0_type\default=true
player_0_vibration_enabled=true
@@ -153,60 +153,60 @@ player_1_body_color_left=4278893030
player_1_body_color_left\default=false
player_1_body_color_right=4294917160
player_1_body_color_right\default=false
-player_1_button_a="toggle:0,code:67,engine:keyboard"
-player_1_button_a\default=true
-player_1_button_b="toggle:0,code:88,engine:keyboard"
-player_1_button_b\default=true
+player_1_button_a="button:1,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_a\default=false
+player_1_button_b="button:0,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_b\default=false
player_1_button_color_left=4278197790
player_1_button_color_left\default=false
player_1_button_color_right=4280158730
player_1_button_color_right\default=false
-player_1_button_ddown="toggle:0,code:16777237,engine:keyboard"
-player_1_button_ddown\default=true
-player_1_button_dleft="toggle:0,code:16777234,engine:keyboard"
-player_1_button_dleft\default=true
-player_1_button_dright="toggle:0,code:16777236,engine:keyboard"
-player_1_button_dright\default=true
-player_1_button_dup="toggle:0,code:16777235,engine:keyboard"
-player_1_button_dup\default=true
-player_1_button_home="toggle:0,code:0,engine:keyboard"
-player_1_button_home\default=true
-player_1_button_l="toggle:0,code:81,engine:keyboard"
-player_1_button_l\default=true
-player_1_button_lstick="toggle:0,code:70,engine:keyboard"
-player_1_button_lstick\default=true
-player_1_button_minus="toggle:0,code:78,engine:keyboard"
-player_1_button_minus\default=true
-player_1_button_plus="toggle:0,code:77,engine:keyboard"
-player_1_button_plus\default=true
-player_1_button_r="toggle:0,code:69,engine:keyboard"
-player_1_button_r\default=true
-player_1_button_rstick="toggle:0,code:71,engine:keyboard"
-player_1_button_rstick\default=true
-player_1_button_screenshot="toggle:0,code:0,engine:keyboard"
-player_1_button_screenshot\default=true
-player_1_button_sl="toggle:0,code:81,engine:keyboard"
-player_1_button_sl\default=true
-player_1_button_sr="toggle:0,code:69,engine:keyboard"
-player_1_button_sr\default=true
-player_1_button_x="toggle:0,code:86,engine:keyboard"
-player_1_button_x\default=true
-player_1_button_y="toggle:0,code:90,engine:keyboard"
-player_1_button_y\default=true
-player_1_button_zl="toggle:0,code:82,engine:keyboard"
-player_1_button_zl\default=true
-player_1_button_zr="toggle:0,code:84,engine:keyboard"
-player_1_button_zr\default=true
-player_1_connected=false
-player_1_connected\default=true
-player_1_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button"
-player_1_lstick\default=true
-player_1_motionleft="toggle:0,code:55,engine:keyboard"
-player_1_motionleft\default=true
-player_1_motionright="toggle:0,code:56,engine:keyboard"
-player_1_motionright\default=true
-player_1_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button"
-player_1_rstick\default=true
+player_1_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_ddown\default=false
+player_1_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_dleft\default=false
+player_1_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_dright\default=false
+player_1_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_dup\default=false
+player_1_button_home="button:8,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_home\default=false
+player_1_button_l="button:4,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_l\default=false
+player_1_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_lstick\default=false
+player_1_button_minus="button:6,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_minus\default=false
+player_1_button_plus="button:7,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_plus\default=false
+player_1_button_r="button:5,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_r\default=false
+player_1_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_rstick\default=false
+player_1_button_screenshot=[empty]
+player_1_button_screenshot\default=false
+player_1_button_sl="button:4,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_sl\default=false
+player_1_button_sr="button:5,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_sr\default=false
+player_1_button_x="button:3,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_x\default=false
+player_1_button_y="button:2,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_y\default=false
+player_1_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:1,invert:+,engine:sdl"
+player_1_button_zl\default=false
+player_1_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:1,invert:+,engine:sdl"
+player_1_button_zr\default=false
+player_1_connected=true
+player_1_connected\default=false
+player_1_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_lstick\default=false
+player_1_motionleft=[empty]
+player_1_motionleft\default=false
+player_1_motionright=[empty]
+player_1_motionright\default=false
+player_1_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_rstick\default=false
player_1_type=0
player_1_type\default=true
player_1_vibration_enabled=true
@@ -217,60 +217,60 @@ player_2_body_color_left=4278893030
player_2_body_color_left\default=false
player_2_body_color_right=4294917160
player_2_body_color_right\default=false
-player_2_button_a="toggle:0,code:67,engine:keyboard"
-player_2_button_a\default=true
-player_2_button_b="toggle:0,code:88,engine:keyboard"
-player_2_button_b\default=true
+player_2_button_a="button:1,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_a\default=false
+player_2_button_b="button:0,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_b\default=false
player_2_button_color_left=4278197790
player_2_button_color_left\default=false
player_2_button_color_right=4280158730
player_2_button_color_right\default=false
-player_2_button_ddown="toggle:0,code:16777237,engine:keyboard"
-player_2_button_ddown\default=true
-player_2_button_dleft="toggle:0,code:16777234,engine:keyboard"
-player_2_button_dleft\default=true
-player_2_button_dright="toggle:0,code:16777236,engine:keyboard"
-player_2_button_dright\default=true
-player_2_button_dup="toggle:0,code:16777235,engine:keyboard"
-player_2_button_dup\default=true
-player_2_button_home="toggle:0,code:0,engine:keyboard"
-player_2_button_home\default=true
-player_2_button_l="toggle:0,code:81,engine:keyboard"
-player_2_button_l\default=true
-player_2_button_lstick="toggle:0,code:70,engine:keyboard"
-player_2_button_lstick\default=true
-player_2_button_minus="toggle:0,code:78,engine:keyboard"
-player_2_button_minus\default=true
-player_2_button_plus="toggle:0,code:77,engine:keyboard"
-player_2_button_plus\default=true
-player_2_button_r="toggle:0,code:69,engine:keyboard"
-player_2_button_r\default=true
-player_2_button_rstick="toggle:0,code:71,engine:keyboard"
-player_2_button_rstick\default=true
-player_2_button_screenshot="toggle:0,code:0,engine:keyboard"
-player_2_button_screenshot\default=true
-player_2_button_sl="toggle:0,code:81,engine:keyboard"
-player_2_button_sl\default=true
-player_2_button_sr="toggle:0,code:69,engine:keyboard"
-player_2_button_sr\default=true
-player_2_button_x="toggle:0,code:86,engine:keyboard"
-player_2_button_x\default=true
-player_2_button_y="toggle:0,code:90,engine:keyboard"
-player_2_button_y\default=true
-player_2_button_zl="toggle:0,code:82,engine:keyboard"
-player_2_button_zl\default=true
-player_2_button_zr="toggle:0,code:84,engine:keyboard"
-player_2_button_zr\default=true
-player_2_connected=false
-player_2_connected\default=true
-player_2_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button"
-player_2_lstick\default=true
-player_2_motionleft="toggle:0,code:55,engine:keyboard"
-player_2_motionleft\default=true
-player_2_motionright="toggle:0,code:56,engine:keyboard"
-player_2_motionright\default=true
-player_2_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button"
-player_2_rstick\default=true
+player_2_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_ddown\default=false
+player_2_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_dleft\default=false
+player_2_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_dright\default=false
+player_2_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_dup\default=false
+player_2_button_home="button:8,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_home\default=false
+player_2_button_l="button:4,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_l\default=false
+player_2_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_lstick\default=false
+player_2_button_minus="button:6,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_minus\default=false
+player_2_button_plus="button:7,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_plus\default=false
+player_2_button_r="button:5,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_r\default=false
+player_2_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_rstick\default=false
+player_2_button_screenshot=[empty]
+player_2_button_screenshot\default=false
+player_2_button_sl="button:4,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_sl\default=false
+player_2_button_sr="button:5,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_sr\default=false
+player_2_button_x="button:3,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_x\default=false
+player_2_button_y="button:2,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_y\default=false
+player_2_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:2,invert:+,engine:sdl"
+player_2_button_zl\default=false
+player_2_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:2,invert:+,engine:sdl"
+player_2_button_zr\default=false
+player_2_connected=true
+player_2_connected\default=false
+player_2_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_lstick\default=false
+player_2_motionleft=[empty]
+player_2_motionleft\default=false
+player_2_motionright=[empty]
+player_2_motionright\default=false
+player_2_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_rstick\default=false
player_2_type=0
player_2_type\default=true
player_2_vibration_enabled=true
@@ -281,60 +281,60 @@ player_3_body_color_left=4278893030
player_3_body_color_left\default=false
player_3_body_color_right=4294917160
player_3_body_color_right\default=false
-player_3_button_a="toggle:0,code:67,engine:keyboard"
-player_3_button_a\default=true
-player_3_button_b="toggle:0,code:88,engine:keyboard"
-player_3_button_b\default=true
+player_3_button_a="button:1,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_a\default=false
+player_3_button_b="button:0,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_b\default=false
player_3_button_color_left=4278197790
player_3_button_color_left\default=false
player_3_button_color_right=4280158730
player_3_button_color_right\default=false
-player_3_button_ddown="toggle:0,code:16777237,engine:keyboard"
-player_3_button_ddown\default=true
-player_3_button_dleft="toggle:0,code:16777234,engine:keyboard"
-player_3_button_dleft\default=true
-player_3_button_dright="toggle:0,code:16777236,engine:keyboard"
-player_3_button_dright\default=true
-player_3_button_dup="toggle:0,code:16777235,engine:keyboard"
-player_3_button_dup\default=true
-player_3_button_home="toggle:0,code:0,engine:keyboard"
-player_3_button_home\default=true
-player_3_button_l="toggle:0,code:81,engine:keyboard"
-player_3_button_l\default=true
-player_3_button_lstick="toggle:0,code:70,engine:keyboard"
-player_3_button_lstick\default=true
-player_3_button_minus="toggle:0,code:78,engine:keyboard"
-player_3_button_minus\default=true
-player_3_button_plus="toggle:0,code:77,engine:keyboard"
-player_3_button_plus\default=true
-player_3_button_r="toggle:0,code:69,engine:keyboard"
-player_3_button_r\default=true
-player_3_button_rstick="toggle:0,code:71,engine:keyboard"
-player_3_button_rstick\default=true
-player_3_button_screenshot="toggle:0,code:0,engine:keyboard"
-player_3_button_screenshot\default=true
-player_3_button_sl="toggle:0,code:81,engine:keyboard"
-player_3_button_sl\default=true
-player_3_button_sr="toggle:0,code:69,engine:keyboard"
-player_3_button_sr\default=true
-player_3_button_x="toggle:0,code:86,engine:keyboard"
-player_3_button_x\default=true
-player_3_button_y="toggle:0,code:90,engine:keyboard"
-player_3_button_y\default=true
-player_3_button_zl="toggle:0,code:82,engine:keyboard"
-player_3_button_zl\default=true
-player_3_button_zr="toggle:0,code:84,engine:keyboard"
-player_3_button_zr\default=true
-player_3_connected=false
-player_3_connected\default=true
-player_3_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button"
-player_3_lstick\default=true
-player_3_motionleft="toggle:0,code:55,engine:keyboard"
-player_3_motionleft\default=true
-player_3_motionright="toggle:0,code:56,engine:keyboard"
-player_3_motionright\default=true
-player_3_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button"
-player_3_rstick\default=true
+player_3_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_ddown\default=false
+player_3_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_dleft\default=false
+player_3_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_dright\default=false
+player_3_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_dup\default=false
+player_3_button_home="button:8,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_home\default=false
+player_3_button_l="button:4,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_l\default=false
+player_3_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_lstick\default=false
+player_3_button_minus="button:6,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_minus\default=false
+player_3_button_plus="button:7,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_plus\default=false
+player_3_button_r="button:5,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_r\default=false
+player_3_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_rstick\default=false
+player_3_button_screenshot=[empty]
+player_3_button_screenshot\default=false
+player_3_button_sl="button:4,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_sl\default=false
+player_3_button_sr="button:5,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_sr\default=false
+player_3_button_x="button:3,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_x\default=false
+player_3_button_y="button:2,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_y\default=false
+player_3_button_zl="threshold:0.5,axis:2,guid:03000000de280000ff11000001000000,port:3,invert:+,engine:sdl"
+player_3_button_zl\default=false
+player_3_button_zr="threshold:0.5,axis:5,guid:03000000de280000ff11000001000000,port:3,invert:+,engine:sdl"
+player_3_button_zr\default=false
+player_3_connected=true
+player_3_connected\default=false
+player_3_lstick="invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_lstick\default=false
+player_3_motionleft=[empty]
+player_3_motionleft\default=false
+player_3_motionright=[empty]
+player_3_motionright\default=false
+player_3_rstick="invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_rstick\default=false
player_3_type=0
player_3_type\default=true
player_3_vibration_enabled=true
@@ -601,60 +601,60 @@ player_8_body_color_left=702950
player_8_body_color_left\default=true
player_8_body_color_right=16727080
player_8_body_color_right\default=true
-player_8_button_a="engine:keyboard,code:67,toggle:0"
-player_8_button_a\default=false
-player_8_button_b="engine:keyboard,code:88,toggle:0"
-player_8_button_b\default=false
+player_8_button_a="toggle:0,code:67,engine:keyboard"
+player_8_button_a\default=true
+player_8_button_b="toggle:0,code:88,engine:keyboard"
+player_8_button_b\default=true
player_8_button_color_left=7710
player_8_button_color_left\default=true
player_8_button_color_right=1968650
player_8_button_color_right\default=true
-player_8_button_ddown="engine:keyboard,code:16777237,toggle:0"
-player_8_button_ddown\default=false
-player_8_button_dleft="engine:keyboard,code:16777234,toggle:0"
-player_8_button_dleft\default=false
-player_8_button_dright="engine:keyboard,code:16777236,toggle:0"
-player_8_button_dright\default=false
-player_8_button_dup="engine:keyboard,code:16777235,toggle:0"
-player_8_button_dup\default=false
-player_8_button_home="engine:keyboard,code:0,toggle:0"
-player_8_button_home\default=false
-player_8_button_l="engine:keyboard,code:81,toggle:0"
-player_8_button_l\default=false
-player_8_button_lstick="engine:keyboard,code:70,toggle:0"
-player_8_button_lstick\default=false
-player_8_button_minus="engine:keyboard,code:78,toggle:0"
-player_8_button_minus\default=false
-player_8_button_plus="engine:keyboard,code:77,toggle:0"
-player_8_button_plus\default=false
-player_8_button_r="engine:keyboard,code:69,toggle:0"
-player_8_button_r\default=false
-player_8_button_rstick="engine:keyboard,code:71,toggle:0"
-player_8_button_rstick\default=false
-player_8_button_screenshot="engine:keyboard,code:0,toggle:0"
-player_8_button_screenshot\default=false
-player_8_button_sl="engine:keyboard,code:81,toggle:0"
-player_8_button_sl\default=false
-player_8_button_sr="engine:keyboard,code:69,toggle:0"
-player_8_button_sr\default=false
-player_8_button_x="engine:keyboard,code:86,toggle:0"
-player_8_button_x\default=false
-player_8_button_y="engine:keyboard,code:90,toggle:0"
-player_8_button_y\default=false
-player_8_button_zl="engine:keyboard,code:82,toggle:0"
-player_8_button_zl\default=false
-player_8_button_zr="engine:keyboard,code:84,toggle:0"
-player_8_button_zr\default=false
+player_8_button_ddown="toggle:0,code:16777237,engine:keyboard"
+player_8_button_ddown\default=true
+player_8_button_dleft="toggle:0,code:16777234,engine:keyboard"
+player_8_button_dleft\default=true
+player_8_button_dright="toggle:0,code:16777236,engine:keyboard"
+player_8_button_dright\default=true
+player_8_button_dup="toggle:0,code:16777235,engine:keyboard"
+player_8_button_dup\default=true
+player_8_button_home="toggle:0,code:0,engine:keyboard"
+player_8_button_home\default=true
+player_8_button_l="toggle:0,code:81,engine:keyboard"
+player_8_button_l\default=true
+player_8_button_lstick="toggle:0,code:70,engine:keyboard"
+player_8_button_lstick\default=true
+player_8_button_minus="toggle:0,code:78,engine:keyboard"
+player_8_button_minus\default=true
+player_8_button_plus="toggle:0,code:77,engine:keyboard"
+player_8_button_plus\default=true
+player_8_button_r="toggle:0,code:69,engine:keyboard"
+player_8_button_r\default=true
+player_8_button_rstick="toggle:0,code:71,engine:keyboard"
+player_8_button_rstick\default=true
+player_8_button_screenshot="toggle:0,code:0,engine:keyboard"
+player_8_button_screenshot\default=true
+player_8_button_sl="toggle:0,code:81,engine:keyboard"
+player_8_button_sl\default=true
+player_8_button_sr="toggle:0,code:69,engine:keyboard"
+player_8_button_sr\default=true
+player_8_button_x="toggle:0,code:86,engine:keyboard"
+player_8_button_x\default=true
+player_8_button_y="toggle:0,code:90,engine:keyboard"
+player_8_button_y\default=true
+player_8_button_zl="toggle:0,code:82,engine:keyboard"
+player_8_button_zl\default=true
+player_8_button_zr="toggle:0,code:84,engine:keyboard"
+player_8_button_zr\default=true
player_8_connected=false
player_8_connected\default=true
-player_8_lstick="engine:analog_from_button,up:toggle$00$1code$087$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,modifier:toggle$00$1code$016777248$1engine$0keyboard,modifier_scale:0.500000"
-player_8_lstick\default=false
-player_8_motionleft="engine:keyboard,code:55,toggle:0"
-player_8_motionleft\default=false
-player_8_motionright="engine:keyboard,code:56,toggle:0"
-player_8_motionright\default=false
-player_8_rstick="engine:analog_from_button,up:toggle$00$1code$073$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,modifier:toggle$00$1code$00$1engine$0keyboard,modifier_scale:0.500000"
-player_8_rstick\default=false
+player_8_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button"
+player_8_lstick\default=true
+player_8_motionleft="toggle:0,code:55,engine:keyboard"
+player_8_motionleft\default=true
+player_8_motionright="toggle:0,code:56,engine:keyboard"
+player_8_motionright\default=true
+player_8_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button"
+player_8_rstick\default=true
player_8_type=0
player_8_type\default=true
player_8_vibration_enabled=true
@@ -725,8 +725,6 @@ player_9_vibration_enabled=true
player_9_vibration_enabled\default=true
player_9_vibration_strength=100
player_9_vibration_strength\default=true
-random_amiibo_id=false
-random_amiibo_id\default=true
ring_controller="modifier_scale:0.050000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$00$1engine$0keyboard,up:toggle$00$1code$00$1engine$0keyboard,engine:analog_from_button"
ring_controller\default=true
tas_enable=false
@@ -751,8 +749,8 @@ touchscreen_enabled=true
touchscreen_enabled\default=true
udp_input_servers=127.0.0.1:26760
udp_input_servers\default=true
-use_docked_mode=true
-use_docked_mode\default=true
+use_docked_mode=false
+use_docked_mode\default=false
vibration_enabled=true
vibration_enabled\default=true
@@ -761,8 +759,6 @@ use_extended_memory_layout=false
use_extended_memory_layout\default=true
use_multi_core=true
use_multi_core\default=true
-use_unsafe_extended_memory_layout=false
-use_unsafe_extended_memory_layout\default=true
[Cpu]
cpu_accuracy=0
@@ -809,7 +805,7 @@ cpuopt_unsafe_unfuse_fma=true
cpuopt_unsafe_unfuse_fma\default=true
[Data%20Storage]
-dump_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/dump
+dump_directory=/var/data/yuzu/dump
dump_directory\default=true
gamecard_current_game=false
gamecard_current_game\default=true
@@ -817,13 +813,13 @@ gamecard_inserted=false
gamecard_inserted\default=true
gamecard_path=
gamecard_path\default=true
-load_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/load
+load_directory=/var/data/yuzu/load
load_directory\default=true
-nand_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/nand
+nand_directory=RETRODECKHOMEDIR/saves/switch/nand
nand_directory\default=true
-sdmc_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/sdmc
+sdmc_directory=RETRODECKHOMEDIR/saves/switch/sdmc
sdmc_directory\default=true
-tas_directory=/home/deck/.var/app/org.yuzu_emu.yuzu/data/yuzu/tas
+tas_directory=/var/data/yuzu/tas
tas_directory\default=true
use_virtual_sd=true
use_virtual_sd\default=true
@@ -858,7 +854,10 @@ use_gdbstub=false
use_gdbstub\default=true
[DisabledAddOns]
-size=0
+1\disabled\size=0
+1\title_id=@Variant(\0\0\0\x84\x1\0\xa3\xd0\b\xc5\xc0\0)
+1\title_id\default=false
+size=1
[Miscellaneous]
log_filter=*:Info
@@ -876,7 +875,7 @@ ip\default=true
ip_ban_list\size=0
max_player=8
max_player\default=true
-nickname=RetroDECK
+nickname=
nickname\default=true
port=24872
port\default=true
@@ -884,7 +883,7 @@ room_description=
room_description\default=true
room_name=
room_name\default=true
-room_nickname=
+room_nickname=RetroDECK
room_nickname\default=true
room_port=24872
room_port\default=true
@@ -897,12 +896,8 @@ anti_aliasing=0
anti_aliasing\default=true
aspect_ratio=0
aspect_ratio\default=true
-astc_recompression=0
-astc_recompression\default=true
async_astc=false
async_astc\default=true
-async_presentation=false
-async_presentation\default=true
backend=1
backend\default=true
bg_blue=0
@@ -915,27 +910,25 @@ debug=false
debug\default=true
disable_shader_loop_safety_checks=false
disable_shader_loop_safety_checks\default=true
-enable_compute_pipelines=false
-enable_compute_pipelines\default=true
force_max_clock=false
force_max_clock\default=true
fsr_sharpening_slider=25
fsr_sharpening_slider\default=true
fullscreen_mode=1
fullscreen_mode\default=true
-gpu_accuracy=1
-gpu_accuracy\default=true
-max_anisotropy=0
-max_anisotropy\default=true
+gpu_accuracy=0
+gpu_accuracy\default=false
+max_anisotropy=1
+max_anisotropy\default=false
nsight_aftermath=false
nsight_aftermath\default=true
nvdec_emulation=2
nvdec_emulation\default=true
resolution_setup=2
resolution_setup\default=true
-scaling_filter=1
-scaling_filter\default=true
-shader_backend=1
+scaling_filter=5
+scaling_filter\default=false
+shader_backend=0
shader_backend\default=true
shader_feedback=false
shader_feedback\default=true
@@ -943,19 +936,15 @@ speed_limit=100
speed_limit\default=true
use_asynchronous_gpu_emulation=true
use_asynchronous_gpu_emulation\default=true
-use_asynchronous_shaders=false
-use_asynchronous_shaders\default=true
+use_asynchronous_shaders=true
+use_asynchronous_shaders\default=false
use_disk_shader_cache=true
use_disk_shader_cache\default=true
use_fast_gpu_time=true
use_fast_gpu_time\default=true
use_pessimistic_flushes=false
use_pessimistic_flushes\default=true
-use_reactive_flushing=true
-use_reactive_flushing\default=true
-use_video_framerate=false
-use_video_framerate\default=true
-use_vsync=2
+use_vsync=true
use_vsync\default=true
use_vulkan_driver_pipeline_cache=true
use_vulkan_driver_pipeline_cache\default=true
@@ -974,10 +963,11 @@ custom_rtc\default=true
custom_rtc_enabled=false
custom_rtc_enabled\default=true
device_name=RetroDECK
-language_index=1
-language_index\default=true
-region_index=1
-region_index\default=true
+device_name\default=false
+language_index=12
+language_index\default=false
+region_index=2
+region_index\default=false
rng_seed=0
rng_seed\default=true
rng_seed_enabled=false
@@ -1029,190 +1019,190 @@ Paths\gamedirs\4\deep_scan=false
Paths\gamedirs\4\deep_scan\default=true
Paths\gamedirs\4\expanded=true
Paths\gamedirs\4\expanded\default=true
-Paths\gamedirs\4\path=
+Paths\gamedirs\4\path=RETRODECKHOMEDIR/roms/switch
Paths\gamedirs\size=4
-Paths\language=
-Paths\language\default=true
+Paths\language=en
+Paths\language\default=false
Paths\recentFiles=@Invalid()
Paths\romsPath=
Paths\symbolsPath=
Screenshots\enable_screenshot_save_as=true
Screenshots\enable_screenshot_save_as\default=true
-Screenshots\screenshot_path=RETRODECKHOMEDIR/screenshots
+Screenshots\screenshot_path=RETRODECKHOMEDIR/screenshots/
Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context=1
Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context\default=true
-Shortcuts\Main%20Window\Audio%20Mute\Unmute\Controller_KeySeq=Home+Dpad_Right
-Shortcuts\Main%20Window\Audio%20Mute\Unmute\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq=Ctrl+M
-Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq\default=true
+Shortcuts\Main%20Window\Audio%20Mute\Unmute\Controller_KeySeq=
+Shortcuts\Main%20Window\Audio%20Mute\Unmute\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq=
+Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq\default=false
Shortcuts\Main%20Window\Audio%20Mute\Unmute\Repeat=false
Shortcuts\Main%20Window\Audio%20Mute\Unmute\Repeat\default=true
-Shortcuts\Main%20Window\Audio%20Volume%20Down\Context=2
-Shortcuts\Main%20Window\Audio%20Volume%20Down\Context\default=true
-Shortcuts\Main%20Window\Audio%20Volume%20Down\Controller_KeySeq=Home+Dpad_Down
-Shortcuts\Main%20Window\Audio%20Volume%20Down\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq=-
-Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq\default=true
+Shortcuts\Main%20Window\Audio%20Volume%20Down\Context=1
+Shortcuts\Main%20Window\Audio%20Volume%20Down\Context\default=false
+Shortcuts\Main%20Window\Audio%20Volume%20Down\Controller_KeySeq=
+Shortcuts\Main%20Window\Audio%20Volume%20Down\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq=
+Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq\default=false
Shortcuts\Main%20Window\Audio%20Volume%20Down\Repeat=true
Shortcuts\Main%20Window\Audio%20Volume%20Down\Repeat\default=true
-Shortcuts\Main%20Window\Audio%20Volume%20Up\Context=2
-Shortcuts\Main%20Window\Audio%20Volume%20Up\Context\default=true
-Shortcuts\Main%20Window\Audio%20Volume%20Up\Controller_KeySeq=Home+Dpad_Up
-Shortcuts\Main%20Window\Audio%20Volume%20Up\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq="="
-Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq\default=true
+Shortcuts\Main%20Window\Audio%20Volume%20Up\Context=1
+Shortcuts\Main%20Window\Audio%20Volume%20Up\Context\default=false
+Shortcuts\Main%20Window\Audio%20Volume%20Up\Controller_KeySeq=
+Shortcuts\Main%20Window\Audio%20Volume%20Up\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq=
+Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq\default=false
Shortcuts\Main%20Window\Audio%20Volume%20Up\Repeat=true
Shortcuts\Main%20Window\Audio%20Volume%20Up\Repeat\default=true
Shortcuts\Main%20Window\Capture%20Screenshot\Context=3
Shortcuts\Main%20Window\Capture%20Screenshot\Context\default=true
-Shortcuts\Main%20Window\Capture%20Screenshot\Controller_KeySeq=Screenshot
-Shortcuts\Main%20Window\Capture%20Screenshot\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+P
-Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq\default=true
+Shortcuts\Main%20Window\Capture%20Screenshot\Controller_KeySeq=
+Shortcuts\Main%20Window\Capture%20Screenshot\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+X
+Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq\default=false
Shortcuts\Main%20Window\Capture%20Screenshot\Repeat=false
Shortcuts\Main%20Window\Capture%20Screenshot\Repeat\default=true
-Shortcuts\Main%20Window\Change%20Adapting%20Filter\Context=2
-Shortcuts\Main%20Window\Change%20Adapting%20Filter\Context\default=true
-Shortcuts\Main%20Window\Change%20Adapting%20Filter\Controller_KeySeq=Home+L
-Shortcuts\Main%20Window\Change%20Adapting%20Filter\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Change%20Adapting%20Filter\KeySeq=F8
-Shortcuts\Main%20Window\Change%20Adapting%20Filter\KeySeq\default=true
+Shortcuts\Main%20Window\Change%20Adapting%20Filter\Context=1
+Shortcuts\Main%20Window\Change%20Adapting%20Filter\Context\default=false
+Shortcuts\Main%20Window\Change%20Adapting%20Filter\Controller_KeySeq=
+Shortcuts\Main%20Window\Change%20Adapting%20Filter\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Change%20Adapting%20Filter\KeySeq=
+Shortcuts\Main%20Window\Change%20Adapting%20Filter\KeySeq\default=false
Shortcuts\Main%20Window\Change%20Adapting%20Filter\Repeat=false
Shortcuts\Main%20Window\Change%20Adapting%20Filter\Repeat\default=true
Shortcuts\Main%20Window\Change%20Docked%20Mode\Context=2
Shortcuts\Main%20Window\Change%20Docked%20Mode\Context\default=true
-Shortcuts\Main%20Window\Change%20Docked%20Mode\Controller_KeySeq=Home+X
-Shortcuts\Main%20Window\Change%20Docked%20Mode\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Change%20Docked%20Mode\KeySeq=F10
-Shortcuts\Main%20Window\Change%20Docked%20Mode\KeySeq\default=true
+Shortcuts\Main%20Window\Change%20Docked%20Mode\Controller_KeySeq=
+Shortcuts\Main%20Window\Change%20Docked%20Mode\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Change%20Docked%20Mode\KeySeq=Alt+D
+Shortcuts\Main%20Window\Change%20Docked%20Mode\KeySeq\default=false
Shortcuts\Main%20Window\Change%20Docked%20Mode\Repeat=false
Shortcuts\Main%20Window\Change%20Docked%20Mode\Repeat\default=true
Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Context=2
Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Context\default=true
-Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Controller_KeySeq=Home+R
-Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Change%20GPU%20Accuracy\KeySeq=F9
-Shortcuts\Main%20Window\Change%20GPU%20Accuracy\KeySeq\default=true
+Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Controller_KeySeq=
+Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Change%20GPU%20Accuracy\KeySeq=Alt+G
+Shortcuts\Main%20Window\Change%20GPU%20Accuracy\KeySeq\default=false
Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Repeat=false
Shortcuts\Main%20Window\Change%20GPU%20Accuracy\Repeat\default=true
Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context=1
Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context\default=true
-Shortcuts\Main%20Window\Continue\Pause%20Emulation\Controller_KeySeq=Home+Plus
-Shortcuts\Main%20Window\Continue\Pause%20Emulation\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq=F4
-Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq\default=true
+Shortcuts\Main%20Window\Continue\Pause%20Emulation\Controller_KeySeq=
+Shortcuts\Main%20Window\Continue\Pause%20Emulation\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq=Ctrl+P
+Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq\default=false
Shortcuts\Main%20Window\Continue\Pause%20Emulation\Repeat=false
Shortcuts\Main%20Window\Continue\Pause%20Emulation\Repeat\default=true
Shortcuts\Main%20Window\Exit%20Fullscreen\Context=1
Shortcuts\Main%20Window\Exit%20Fullscreen\Context\default=true
Shortcuts\Main%20Window\Exit%20Fullscreen\Controller_KeySeq=
Shortcuts\Main%20Window\Exit%20Fullscreen\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq=
+Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq=Ctrl+O
Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq\default=false
Shortcuts\Main%20Window\Exit%20Fullscreen\Repeat=false
Shortcuts\Main%20Window\Exit%20Fullscreen\Repeat\default=true
Shortcuts\Main%20Window\Exit%20yuzu\Context=1
Shortcuts\Main%20Window\Exit%20yuzu\Context\default=true
-Shortcuts\Main%20Window\Exit%20yuzu\Controller_KeySeq=Home+Minus
-Shortcuts\Main%20Window\Exit%20yuzu\Controller_KeySeq\default=true
+Shortcuts\Main%20Window\Exit%20yuzu\Controller_KeySeq=
+Shortcuts\Main%20Window\Exit%20yuzu\Controller_KeySeq\default=false
Shortcuts\Main%20Window\Exit%20yuzu\KeySeq=Ctrl+Q
-Shortcuts\Main%20Window\Exit%20yuzu\KeySeq\default=true
+Shortcuts\Main%20Window\Exit%20yuzu\KeySeq\default=false
Shortcuts\Main%20Window\Exit%20yuzu\Repeat=false
Shortcuts\Main%20Window\Exit%20yuzu\Repeat\default=true
Shortcuts\Main%20Window\Fullscreen\Context=1
Shortcuts\Main%20Window\Fullscreen\Context\default=true
-Shortcuts\Main%20Window\Fullscreen\Controller_KeySeq=Home+B
-Shortcuts\Main%20Window\Fullscreen\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Fullscreen\KeySeq=F11
-Shortcuts\Main%20Window\Fullscreen\KeySeq\default=true
+Shortcuts\Main%20Window\Fullscreen\Controller_KeySeq=
+Shortcuts\Main%20Window\Fullscreen\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Fullscreen\KeySeq=Ctrl+Return
+Shortcuts\Main%20Window\Fullscreen\KeySeq\default=false
Shortcuts\Main%20Window\Fullscreen\Repeat=false
Shortcuts\Main%20Window\Fullscreen\Repeat\default=true
-Shortcuts\Main%20Window\Load%20File\Context=3
-Shortcuts\Main%20Window\Load%20File\Context\default=true
+Shortcuts\Main%20Window\Load%20File\Context=1
+Shortcuts\Main%20Window\Load%20File\Context\default=false
Shortcuts\Main%20Window\Load%20File\Controller_KeySeq=
Shortcuts\Main%20Window\Load%20File\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Load%20File\KeySeq=Ctrl+O
-Shortcuts\Main%20Window\Load%20File\KeySeq\default=true
+Shortcuts\Main%20Window\Load%20File\KeySeq=
+Shortcuts\Main%20Window\Load%20File\KeySeq\default=false
Shortcuts\Main%20Window\Load%20File\Repeat=false
Shortcuts\Main%20Window\Load%20File\Repeat\default=true
Shortcuts\Main%20Window\Load\Remove%20Amiibo\Context=3
Shortcuts\Main%20Window\Load\Remove%20Amiibo\Context\default=true
-Shortcuts\Main%20Window\Load\Remove%20Amiibo\Controller_KeySeq=Home+A
-Shortcuts\Main%20Window\Load\Remove%20Amiibo\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Load\Remove%20Amiibo\KeySeq=F2
-Shortcuts\Main%20Window\Load\Remove%20Amiibo\KeySeq\default=true
+Shortcuts\Main%20Window\Load\Remove%20Amiibo\Controller_KeySeq=
+Shortcuts\Main%20Window\Load\Remove%20Amiibo\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Load\Remove%20Amiibo\KeySeq=Alt+M
+Shortcuts\Main%20Window\Load\Remove%20Amiibo\KeySeq\default=false
Shortcuts\Main%20Window\Load\Remove%20Amiibo\Repeat=false
Shortcuts\Main%20Window\Load\Remove%20Amiibo\Repeat\default=true
Shortcuts\Main%20Window\Restart%20Emulation\Context=1
Shortcuts\Main%20Window\Restart%20Emulation\Context\default=true
Shortcuts\Main%20Window\Restart%20Emulation\Controller_KeySeq=
Shortcuts\Main%20Window\Restart%20Emulation\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Restart%20Emulation\KeySeq=F6
-Shortcuts\Main%20Window\Restart%20Emulation\KeySeq\default=true
+Shortcuts\Main%20Window\Restart%20Emulation\KeySeq=Ctrl+R
+Shortcuts\Main%20Window\Restart%20Emulation\KeySeq\default=false
Shortcuts\Main%20Window\Restart%20Emulation\Repeat=false
Shortcuts\Main%20Window\Restart%20Emulation\Repeat\default=true
Shortcuts\Main%20Window\Stop%20Emulation\Context=1
Shortcuts\Main%20Window\Stop%20Emulation\Context\default=true
Shortcuts\Main%20Window\Stop%20Emulation\Controller_KeySeq=
Shortcuts\Main%20Window\Stop%20Emulation\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Stop%20Emulation\KeySeq=F5
-Shortcuts\Main%20Window\Stop%20Emulation\KeySeq\default=true
+Shortcuts\Main%20Window\Stop%20Emulation\KeySeq=
+Shortcuts\Main%20Window\Stop%20Emulation\KeySeq\default=false
Shortcuts\Main%20Window\Stop%20Emulation\Repeat=false
Shortcuts\Main%20Window\Stop%20Emulation\Repeat\default=true
-Shortcuts\Main%20Window\TAS%20Record\Context=2
-Shortcuts\Main%20Window\TAS%20Record\Context\default=true
+Shortcuts\Main%20Window\TAS%20Record\Context=1
+Shortcuts\Main%20Window\TAS%20Record\Context\default=false
Shortcuts\Main%20Window\TAS%20Record\Controller_KeySeq=
Shortcuts\Main%20Window\TAS%20Record\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\TAS%20Record\KeySeq=Ctrl+F7
-Shortcuts\Main%20Window\TAS%20Record\KeySeq\default=true
+Shortcuts\Main%20Window\TAS%20Record\KeySeq=
+Shortcuts\Main%20Window\TAS%20Record\KeySeq\default=false
Shortcuts\Main%20Window\TAS%20Record\Repeat=false
Shortcuts\Main%20Window\TAS%20Record\Repeat\default=true
-Shortcuts\Main%20Window\TAS%20Reset\Context=2
-Shortcuts\Main%20Window\TAS%20Reset\Context\default=true
+Shortcuts\Main%20Window\TAS%20Reset\Context=1
+Shortcuts\Main%20Window\TAS%20Reset\Context\default=false
Shortcuts\Main%20Window\TAS%20Reset\Controller_KeySeq=
Shortcuts\Main%20Window\TAS%20Reset\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\TAS%20Reset\KeySeq=Ctrl+F6
-Shortcuts\Main%20Window\TAS%20Reset\KeySeq\default=true
+Shortcuts\Main%20Window\TAS%20Reset\KeySeq=
+Shortcuts\Main%20Window\TAS%20Reset\KeySeq\default=false
Shortcuts\Main%20Window\TAS%20Reset\Repeat=false
Shortcuts\Main%20Window\TAS%20Reset\Repeat\default=true
-Shortcuts\Main%20Window\TAS%20Start\Stop\Context=2
-Shortcuts\Main%20Window\TAS%20Start\Stop\Context\default=true
+Shortcuts\Main%20Window\TAS%20Start\Stop\Context=1
+Shortcuts\Main%20Window\TAS%20Start\Stop\Context\default=false
Shortcuts\Main%20Window\TAS%20Start\Stop\Controller_KeySeq=
Shortcuts\Main%20Window\TAS%20Start\Stop\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\TAS%20Start\Stop\KeySeq=Ctrl+F5
-Shortcuts\Main%20Window\TAS%20Start\Stop\KeySeq\default=true
+Shortcuts\Main%20Window\TAS%20Start\Stop\KeySeq=
+Shortcuts\Main%20Window\TAS%20Start\Stop\KeySeq\default=false
Shortcuts\Main%20Window\TAS%20Start\Stop\Repeat=false
Shortcuts\Main%20Window\TAS%20Start\Stop\Repeat\default=true
Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context=1
Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context\default=true
Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Controller_KeySeq=
Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq=Ctrl+F
-Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=true
+Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq=
+Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=false
Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Repeat=false
Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Repeat\default=true
Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Context=2
Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Context\default=true
-Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Controller_KeySeq=Home+Y
-Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\KeySeq=Ctrl+U
-Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\KeySeq\default=true
+Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Controller_KeySeq=
+Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Controller_KeySeq\default=false
+Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\KeySeq=Ctrl+Z
+Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\KeySeq\default=false
Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Repeat=false
Shortcuts\Main%20Window\Toggle%20Framerate%20Limit\Repeat\default=true
-Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Context=2
-Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Context\default=true
+Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Context=1
+Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Context\default=false
Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Controller_KeySeq=
Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\KeySeq=Ctrl+F9
-Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\KeySeq\default=true
+Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\KeySeq=
+Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\KeySeq\default=false
Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Repeat=false
Shortcuts\Main%20Window\Toggle%20Mouse%20Panning\Repeat\default=true
Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context=1
Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context\default=true
Shortcuts\Main%20Window\Toggle%20Status%20Bar\Controller_KeySeq=
Shortcuts\Main%20Window\Toggle%20Status%20Bar\Controller_KeySeq\default=true
-Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq=Ctrl+S
-Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=true
+Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq=
+Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=false
Shortcuts\Main%20Window\Toggle%20Status%20Bar\Repeat=false
Shortcuts\Main%20Window\Toggle%20Status%20Bar\Repeat\default=true
UIGameList\cache_game_list=true
@@ -1230,19 +1220,25 @@ UIGameList\row_2_text_id=2
UIGameList\row_2_text_id\default=true
UIGameList\show_add_ons=true
UIGameList\show_add_ons\default=true
-UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x5\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4\x33\0\0\0\x5\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x5\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x87\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64)
-UILayout\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1\r\0\0\0p\0\0\x5?\0\0\x3\n\0\0\x1\r\0\0\0\x8d\0\0\x5?\0\0\x3\n\0\0\0\0\0\0\0\0\x6M\0\0\x1\r\0\0\0\x8d\0\0\x5?\0\0\x3\n)
-UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\x6M\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
-UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe7\0\0\x2W\0\0\0\0\0\0\0\0\0\0\x3\xe7\0\0\x2W\0\0\0\0\0\0\0\0\x6M\0\0\0\0\0\0\0\0\0\0\x3\xe7\0\0\x2W)
+UIGameList\show_compat=false
+UIGameList\show_compat\default=true
+UIGameList\show_size=true
+UIGameList\show_size\default=true
+UIGameList\show_types=true
+UIGameList\show_types\default=true
+UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x5\x1\0\0\0\0\0\0\0\0\0\0\0\x5\x2\0\0\0\x1\0\0\0\x1\0\0\0\x64\0\0\x4X\0\0\0\x5\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x5\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\x1\x10\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64)
+UILayout\geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x4W\0\0\x2\x14\0\0\0\0\0\0\0\0\0\0\x4W\0\0\x2\x14\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\0\0\0\x4W\0\0\x2\x14)
+UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31)
+UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\0\x4\xfd\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k)
UILayout\microProfileDialogVisible=false
UILayout\microProfileDialogVisible\default=true
-UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0y\x1\0\0\x3\0\0\x4\x33\0\0\x2G\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0)
+UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\x4X\0\0\x1\xeb\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0)
calloutFlags=1
calloutFlags\default=false
-confirmClose=true
-confirmClose\default=true
-disable_web_applet=true
-disable_web_applet\default=true
+confirmClose=false
+confirmClose\default=false
+disable_web_applet=false
+disable_web_applet\default=false
displayTitleBars=true
displayTitleBars\default=true
enable_discord_presence=true
@@ -1267,8 +1263,8 @@ showStatusBar=true
showStatusBar\default=true
singleWindowMode=true
singleWindowMode\default=true
-theme=colorful
-theme\default=true
+theme=colorful_dark
+theme\default=false
[WebService]
enable_telemetry=false
@@ -1277,5 +1273,5 @@ web_api_url=https://api.yuzu-emu.org
web_api_url\default=true
yuzu_token=
yuzu_token\default=true
-yuzu_username=
-yuzu_username\default=true
\ No newline at end of file
+yuzu_username=RetroDECK
+yuzu_username\default=true
diff --git a/emu-configs/dolphin/DSUClient.ini b/emu-configs/dolphin/DSUClient.ini
new file mode 100644
index 00000000..48353009
--- /dev/null
+++ b/emu-configs/dolphin/DSUClient.ini
@@ -0,0 +1,3 @@
+[Server]
+Enabled = True
+Entries = steamdeckgyro:127.0.0.1:26760;
diff --git a/emu-configs/dolphin/Dolphin.ini b/emu-configs/dolphin/Dolphin.ini
index 07a56ad8..fb00bed7 100644
--- a/emu-configs/dolphin/Dolphin.ini
+++ b/emu-configs/dolphin/Dolphin.ini
@@ -3,6 +3,7 @@ ID = 09426e1e3e44d72728fb46a9e4a54663
PermissionAsked = True
[Core]
GFXBackend = Vulkan
+AutoDiscChange = True
SelectedLanguage = 0
SerialPort1 = 255
SkipIPL = True
@@ -22,9 +23,13 @@ DPL2Quality = 2
DSPHLE = True
WiiSDCardAllowWrites = True
WiiSDCardEnableFolderSync = False
+CPUThread = True
+MMU = False
+EnableCheats = False
[Display]
Fullscreen = True
DisableScreenSaver = True
+KeepWindowOnTop = False
[GBA]
BIOS = RETRODECKHOMEDIR/bios
Rom1 =
@@ -37,11 +42,12 @@ Threads = True
[General]
ISOPath0 = RETRODECKHOMEDIR/roms/wii
ISOPath1 = RETRODECKHOMEDIR/roms/gc
-ISOPaths = 2
+ISOPaths = 3
WiiSDCardPath = RETRODECKHOMEDIR/saves/wii/dolphin/sd.raw
WirelessMac = 00:17:ab:83:9b:d4
HotkeysRequireFocus = True
RecursiveISOPaths = True
+ISOPath2 = RETRODECKHOMEDIR/roms/wii
[NetPlay]
TraversalChoice = direct
[BluetoothPassthrough]
@@ -58,3 +64,5 @@ PauseOnFocusLost = True
ShowActiveTitle = True
UseBuiltinTitleDatabase = True
UsePanicHandlers = True
+LanguageCode = en
+ThemeName = Clean
diff --git a/emu-configs/dolphin/GBA.ini b/emu-configs/dolphin/GBA.ini
new file mode 100644
index 00000000..f8002127
--- /dev/null
+++ b/emu-configs/dolphin/GBA.ini
@@ -0,0 +1,44 @@
+[GBA1]
+Device = evdev/0/Microsoft X-Box 360 pad 0
+Buttons/B = EAST
+Buttons/A = SOUTH
+Buttons/Z = TR
+Buttons/SELECT = SELECT
+Buttons/START = START
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
+[GBA2]
+Device = evdev/0/Microsoft X-Box 360 pad 1
+Buttons/B = EAST
+Buttons/A = SOUTH
+Buttons/Z = TR
+Buttons/SELECT = SELECT
+Buttons/START = START
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
+[GBA3]
+Device = evdev/0/Microsoft X-Box 360 pad 2
+Buttons/B = EAST
+Buttons/A = SOUTH
+Buttons/Z = TR
+Buttons/SELECT = SELECT
+Buttons/START = START
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
+[GBA4]
+Device = evdev/0/Microsoft X-Box 360 pad 3
+Buttons/B = EAST
+Buttons/A = SOUTH
+Buttons/Z = TR
+Buttons/SELECT = SELECT
+Buttons/START = START
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
diff --git a/emu-configs/dolphin/GCPadNew.ini b/emu-configs/dolphin/GCPadNew.ini
index 7c2d8a7c..97dabd06 100644
--- a/emu-configs/dolphin/GCPadNew.ini
+++ b/emu-configs/dolphin/GCPadNew.ini
@@ -4,20 +4,20 @@ Buttons/A = SOUTH
Buttons/B = EAST
Buttons/X = NORTH
Buttons/Y = WEST
-Buttons/Z = `TR` | `TL`
+Buttons/Z = TR | TL
Buttons/Start = START
Main Stick/Up = `Axis 1-`
Main Stick/Down = `Axis 1+`
Main Stick/Left = `Axis 0-`
Main Stick/Right = `Axis 0+`
-Main Stick/Modifier = `Shift`
+Main Stick/Modifier = THUMBL
Main Stick/Modifier/Range = 50.0
Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
C-Stick/Up = `Axis 4-`
C-Stick/Down = `Axis 4+`
C-Stick/Left = `Axis 3-`
C-Stick/Right = `Axis 3+`
-C-Stick/Modifier = `Ctrl`
+C-Stick/Modifier = THUMBR
C-Stick/Modifier/Range = 50.0
C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
Triggers/L = `Full Axis 2+`
@@ -26,16 +26,99 @@ D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
+Triggers/L-Analog = `Full Axis 2+`
+Triggers/R-Analog = `Full Axis 5+`
Rumble/Motor = Strong
[GCPad2]
-Device = XInput2/0/Virtual core pointer
+Device = evdev/0/Microsoft X-Box 360 pad 1
+Buttons/A = SOUTH
+Buttons/B = EAST
+Buttons/X = NORTH
+Buttons/Y = WEST
+Buttons/Z = TR | TL
+Buttons/Start = START
+Main Stick/Up = `Axis 1-`
+Main Stick/Down = `Axis 1+`
+Main Stick/Left = `Axis 0-`
+Main Stick/Right = `Axis 0+`
+Main Stick/Modifier = THUMBL
Main Stick/Modifier/Range = 50.0
+Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
+C-Stick/Up = `Axis 4-`
+C-Stick/Down = `Axis 4+`
+C-Stick/Left = `Axis 3-`
+C-Stick/Right = `Axis 3+`
+C-Stick/Modifier = THUMBR
C-Stick/Modifier/Range = 50.0
+C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
+Triggers/L = `Full Axis 2+`
+Triggers/R = `Full Axis 5+`
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
+Triggers/L-Analog = `Full Axis 2+`
+Triggers/R-Analog = `Full Axis 5+`
+Rumble/Motor = Strong
[GCPad3]
-Device = XInput2/0/Virtual core pointer
+Device = evdev/0/Microsoft X-Box 360 pad 2
+Buttons/A = SOUTH
+Buttons/B = EAST
+Buttons/X = NORTH
+Buttons/Y = WEST
+Buttons/Z = TR | TL
+Buttons/Start = START
+Main Stick/Up = `Axis 1-`
+Main Stick/Down = `Axis 1+`
+Main Stick/Left = `Axis 0-`
+Main Stick/Right = `Axis 0+`
+Main Stick/Modifier = THUMBL
Main Stick/Modifier/Range = 50.0
+Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
+C-Stick/Up = `Axis 4-`
+C-Stick/Down = `Axis 4+`
+C-Stick/Left = `Axis 3-`
+C-Stick/Right = `Axis 3+`
+C-Stick/Modifier = THUMBR
C-Stick/Modifier/Range = 50.0
+C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
+Triggers/L = `Full Axis 2+`
+Triggers/R = `Full Axis 5+`
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
+Triggers/L-Analog = `Full Axis 2+`
+Triggers/R-Analog = `Full Axis 5+`
+Rumble/Motor = Strong
[GCPad4]
-Device = XInput2/0/Virtual core pointer
+Device = evdev/0/Microsoft X-Box 360 pad 3
+Buttons/A = SOUTH
+Buttons/B = EAST
+Buttons/X = NORTH
+Buttons/Y = WEST
+Buttons/Z = TR | TL
+Buttons/Start = START
+Main Stick/Up = `Axis 1-`
+Main Stick/Down = `Axis 1+`
+Main Stick/Left = `Axis 0-`
+Main Stick/Right = `Axis 0+`
+Main Stick/Modifier = THUMBL
Main Stick/Modifier/Range = 50.0
-C-Stick/Modifier/Range = 50.0
\ No newline at end of file
+Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
+C-Stick/Up = `Axis 4-`
+C-Stick/Down = `Axis 4+`
+C-Stick/Left = `Axis 3-`
+C-Stick/Right = `Axis 3+`
+C-Stick/Modifier = THUMBR
+C-Stick/Modifier/Range = 50.0
+C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
+Triggers/L = `Full Axis 2+`
+Triggers/R = `Full Axis 5+`
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
+Triggers/L-Analog = `Full Axis 2+`
+Triggers/R-Analog = `Full Axis 5+`
+Rumble/Motor = Strong
diff --git a/emu-configs/dolphin/GFX.ini b/emu-configs/dolphin/GFX.ini
index 76065805..3b7d355a 100644
--- a/emu-configs/dolphin/GFX.ini
+++ b/emu-configs/dolphin/GFX.ini
@@ -8,12 +8,26 @@ DeferEFBCopies = True
EFBEmulateFormatChanges = False
EFBScaledCopy = True
EFBToTextureEnable = True
+ImmediateXFBEnable = True
SkipDuplicateXFBs = True
XFBToTextureEnable = True
+EFBAccessEnable = False
+[PrimeHack Misc]
+AutoEFBMP = True
+Lock Camera in Motion Puzzles = True
+ReduceBloom = True
+ToggleArmRePosition = True
[Settings]
+AspectRatio = 1
BackendMultithreading = True
DumpBaseTextures = True
DumpMipTextures = True
FastDepthCalc = True
-InternalResolution = 1
+InternalResolution = 2
SaveTextureCacheToState = True
+WaitForShadersBeforeStarting = True
+wideScreenHack = True
+CacheHiresTextures = True
+HiresTextures = True
+[Hardware]
+VSync = True
diff --git a/emu-configs/dolphin/Hotkeys.ini b/emu-configs/dolphin/Hotkeys.ini
index fdf30cae..b70a917e 100644
--- a/emu-configs/dolphin/Hotkeys.ini
+++ b/emu-configs/dolphin/Hotkeys.ini
@@ -6,7 +6,7 @@ General/Reset = @(Ctrl+R)
General/Take Screenshot = @(Ctrl+X)
General/Exit = @(Ctrl+Q)
Emulation Speed/Decrease Emulation Speed = @(Ctrl+`2`)
-Emulation Speed/Increase Emulation Speed = @(Ctrl+`1`)
+Emulation Speed/Increase Emulation Speed = `Click 3` + `F3` + `F5`
Emulation Speed/Disable Emulation Speed Limit = @(Ctrl+`0`)
Movie/Start Recording = @(Ctrl+V)
Graphics Toggles/Toggle Aspect Ratio = @(Ctrl+W)
@@ -26,4 +26,4 @@ Wii/Connect Wii Remote 1 = @(Alt+W+`1`)
Wii/Connect Wii Remote 2 = @(Alt+W+`2`)
Wii/Connect Wii Remote 3 = @(Alt+W+`3`)
Wii/Connect Wii Remote 4 = @(Alt+W+`4`)
-Wii/Connect Balance Board = @(Alt+W+`5`)
\ No newline at end of file
+Wii/Connect Balance Board = @(Alt+W+`5`)
diff --git a/emu-configs/primehack/Logger.ini b/emu-configs/dolphin/Logger.ini
similarity index 100%
rename from emu-configs/primehack/Logger.ini
rename to emu-configs/dolphin/Logger.ini
diff --git a/emu-configs/dolphin/Qt.ini b/emu-configs/dolphin/Qt.ini
index d4d636e2..3188a9f0 100644
--- a/emu-configs/dolphin/Qt.ini
+++ b/emu-configs/dolphin/Qt.ini
@@ -1,28 +1,28 @@
[breakpointwidget]
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
[cheatsmanager]
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\x1\0\0\0\0\x5\0\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
[codewidget]
boxsplitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x4\0\0\0\x85\0\0\0\x85\0\0\0\x85\0\0\0\x85\x1\xff\xff\xff\xff\x1\0\0\0\x2\0)
codesplitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0\x82\0\0\0W\x1\xff\xff\xff\xff\x1\0\0\0\x1\0)
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
[gridview]
-scale=@Variant(\0\0\0\x87?\x80\0\0)
+scale=1
[jitwidget]
asmsplitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0W\0\0\0W\x1\xff\xff\xff\xff\x1\0\0\0\x1\0)
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
tablesplitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0W\0\0\0W\x1\xff\xff\xff\xff\x1\0\0\0\x2\0)
[logconfigwidget]
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
[logging]
font=0
@@ -30,11 +30,11 @@ wraplines=false
[logwidget]
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
[mainwindow]
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\r\xb7\0\0\x1\x1\0\0\x10\xd6\0\0\x3\x32\0\0\r\xb7\0\0\x1\x1e\0\0\x10\xd6\0\0\x3\x32\0\0\0\0\0\0\0\0\xf\0\0\0\r\xb7\0\0\x1\x1e\0\0\x10\xd6\0\0\x3\x32)
-state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfc\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\xff\xff\xff\xfa\xff\xff\xff\xff\x2\0\0\0\n\xfb\0\0\0\x6\0l\0o\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xb1\x1\0\0\x3\xfb\0\0\0\x12\0l\0o\0g\0\x63\0o\0n\0\x66\0i\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\x1b\x1\0\0\x3\xfb\0\0\0\b\0\x63\0o\0\x64\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\x61\x1\0\0\x3\xfb\0\0\0\x12\0r\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0}\x1\0\0\x3\xfb\0\0\0\xe\0t\0h\0r\0\x65\0\x61\0\x64\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\x91\x1\0\0\x3\xfb\0\0\0\n\0w\0\x61\0t\0\x63\0h\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xab\x1\0\0\x3\xfb\0\0\0\x16\0\x62\0r\0\x65\0\x61\0k\0p\0o\0i\0n\0t\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xab\x1\0\0\x3\xfb\0\0\0\f\0m\0\x65\0m\0o\0r\0y\0\0\0\0\0\xff\xff\xff\xff\0\0\0}\x1\0\0\x3\xfb\0\0\0\xe\0n\0\x65\0t\0w\0o\0r\0k\0\0\0\0\0\xff\xff\xff\xff\0\0\x2w\x1\0\0\x3\xfb\0\0\0\x12\0j\0i\0t\0w\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\x1\x1\0\0\x3\0\0\x3 \0\0\x1\xa1\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x1\0\0\0\xe\0t\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf)
+state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfc\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\xff\xff\xff\xfa\xff\xff\xff\xff\x2\0\0\0\n\xfb\0\0\0\x6\0l\0o\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x87\0\xff\xff\xff\xfb\0\0\0\x12\0l\0o\0g\0\x63\0o\0n\0\x66\0i\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xb8\0\xff\xff\xff\xfb\0\0\0\b\0\x63\0o\0\x64\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xfd\0\xff\xff\xff\xfb\0\0\0\x12\0r\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0]\0\xff\xff\xff\xfb\0\0\0\xe\0t\0h\0r\0\x65\0\x61\0\x64\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\f\0\xff\xff\xff\xfb\0\0\0\n\0w\0\x61\0t\0\x63\0h\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0\x16\0\x62\0r\0\x65\0\x61\0k\0p\0o\0i\0n\0t\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0\f\0m\0\x65\0m\0o\0r\0y\0\0\0\0\0\xff\xff\xff\xff\0\0\0]\0\xff\xff\xff\xfb\0\0\0\xe\0n\0\x65\0t\0w\0o\0r\0k\0\0\0\0\0\xff\xff\xff\xff\0\0\x2\x11\0\xff\xff\xff\xfb\0\0\0\x12\0j\0i\0t\0w\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xc3\0\xff\xff\xff\0\0\x3 \0\0\x2\x4\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x1\0\0\0\xe\0t\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0)
[memorywidget]
addrspace_auxiliary=false
@@ -44,8 +44,10 @@ bplog=true
bpread=false
bpreadwrite=true
bpwrite=false
+display_type=1
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
+inputcombo=1
searchascii=true
searchhex=false
splitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\xff\xff\xff\xff\xff\xff\xff\xff\x1\xff\xff\xff\xff\x1\0\0\0\x1\0)
@@ -56,29 +58,29 @@ typeu32=false
typeu8=true
[netplaydialog]
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\x2\x7f\0\0\x1\xf3\0\0\0\0\0\0\0\x14\0\0\x2\x7f\0\0\x1\xf3\0\0\0\x1\0\0\0\0\x5\0\0\0\0\0\0\0\0\x14\0\0\x2\x7f\0\0\x1\xf3)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf)
splitter=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0\xa5\0\0\0\xd7\x1\xff\xff\xff\xff\x1\0\0\0\x1\0)
[networkwidget]
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
[registerwidget]
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
[renderwidget]
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\x5\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\x7f\0\0\x1\xdf)
[tableheader]
-state=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\x2\x1\0\0\0\0\0\0\0\0\0\0\0\xe(?\0\0\0\b\0\0\0\t\0\0\0\x64\0\0\0\b\0\0\0\x64\0\0\0\v\0\0\0\x64\0\0\0\n\0\0\0\x64\0\0\0\r\0\0\0\x64\0\0\0\f\0\0\0\x64\0\0\0\x3\0\0\0\x64\0\0\0\x5\0\0\0\x46\0\0\x3\v\0\0\0\xe\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0&\0\0\0\x84\0\0\0\0\0\0\0\xe\0\0\0&\0\0\0\x1\0\0\0\x2\0\0\0\x66\0\0\0\x1\0\0\0\x2\0\0\x1\x2\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\x1\x2\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0&\0\0\0\x1\0\0\0\x2\0\0\0U\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\0)
+state=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\x2\x1\0\0\0\0\0\0\0\0\0\0\0\xe(?\0\0\0\b\0\0\0\f\0\0\0\x64\0\0\0\r\0\0\0\x64\0\0\0\x3\0\0\0\x64\0\0\0\x5\0\0\0\x46\0\0\0\v\0\0\0\x64\0\0\0\t\0\0\0\x64\0\0\0\n\0\0\0\x64\0\0\0\b\0\0\0\x64\0\0\x3\x13\0\0\0\xe\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0&\0\0\0\x84\0\0\0\0\0\0\0\xe\0\0\0&\0\0\0\x1\0\0\0\x2\0\0\0\x66\0\0\0\x1\0\0\0\x2\0\0\x1\x6\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\x1\x6\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0&\0\0\0\x1\0\0\0\x2\0\0\0U\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\0\0\0\0\0)
[threadwidget]
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
[toolbar]
-visible=true
+visible=false
[userstyle]
enabled=false
@@ -86,4 +88,4 @@ name=
[watchwidget]
floating=false
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31\0\0\0\0\0\0\0\0\xf\0\0\0\x6\xe0\0\0\0\x14\0\0\aC\0\0\0\x31)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x1d)
diff --git a/emu-configs/dolphin/WiimoteNew.ini b/emu-configs/dolphin/WiimoteNew.ini
index 79183554..67ab3a89 100644
--- a/emu-configs/dolphin/WiimoteNew.ini
+++ b/emu-configs/dolphin/WiimoteNew.ini
@@ -1,15 +1,6 @@
[Wiimote1]
Device = evdev/0/Microsoft X-Box 360 pad 0
-Tilt/Modifier/Range = 50.0
-Nunchuk/Stick/Modifier/Range = 50.0
-Nunchuk/Tilt/Modifier/Range = 50.0
-Classic/Left Stick/Modifier/Range = 50.0
-Classic/Right Stick/Modifier/Range = 50.0
-Guitar/Stick/Modifier/Range = 50.0
-Drums/Stick/Modifier/Range = 50.0
-Turntable/Stick/Modifier/Range = 50.0
-uDraw/Stylus/Modifier/Range = 50.0
-Drawsome/Stylus/Modifier/Range = 50.0
+Source = 1
Buttons/A = `SOUTH` | `Click 1` | `XInput2/0/Virtual core pointer:Click 1`
Buttons/B = EAST
Buttons/1 = WEST
@@ -21,63 +12,347 @@ D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
-Extension = Nunchuk
Rumble/Motor = Strong
+Shake/X = TL
+Shake/Y = TL
+Shake/Z = TL
+Extension = Nunchuk
Nunchuk/Stick/Up = `Axis 1-`
Nunchuk/Stick/Down = `Axis 1+`
Nunchuk/Stick/Left = `Axis 0-`
Nunchuk/Stick/Right = `Axis 0+`
-Nunchuk/Buttons/C = TL
-Nunchuk/Buttons/Z = `Full Axis 2+`
-IR/Auto-Hide = True
+Nunchuk/Buttons/C = TR
+Nunchuk/Buttons/Z = `Full Axis 5+` | `Full Axis 2+`
+Nunchuk/Shake/X = `TL`&`Full Axis 2+`
+Nunchuk/Shake/Y = `TL`&`Full Axis 2+`
+Nunchuk/Shake/Z = `TL`&`Full Axis 2+`
Hotkeys/Sideways Toggle = `XInput2/0/Virtual core pointer:Alt`&`XInput2/0/Virtual core pointer:X`
Hotkeys/Upright Toggle = `XInput2/0/Virtual core pointer:Alt_L`&`XInput2/0/Virtual core pointer:Z`
-Source = 1
+Classic/Buttons/A = EAST
+Classic/Buttons/B = SOUTH
+Classic/Buttons/X = WEST
+Classic/Buttons/Y = NORTH
+Classic/Buttons/ZL = TL
+Classic/Buttons/ZR = TR
+Classic/Buttons/- = SELECT
+Classic/Buttons/+ = START
+Classic/Left Stick/Up = `Axis 1-`
+Classic/Left Stick/Down = `Axis 1+`
+Classic/Left Stick/Left = `Axis 0-`
+Classic/Left Stick/Right = `Axis 0+`
+Classic/Left Stick/Modifier/Range = 50.0
+Classic/Left Stick/Calibration = 100.00 101.96 107.63 112.05 110.67 111.78 105.49 101.89 100.00 101.96 108.24 112.08 112.34 109.50 107.04 101.96 100.00 101.96 106.95 114.00 115.73 117.91 108.24 101.96 100.00 101.96 108.24 106.97 109.81 109.07 108.24 101.96
+Classic/Right Stick/Up = `Axis 4-`
+Classic/Right Stick/Down = `Axis 4+`
+Classic/Right Stick/Left = `Axis 3-`
+Classic/Right Stick/Right = `Axis 3+`
+Classic/Right Stick/Modifier/Range = 50.0
+Classic/Right Stick/Calibration = 100.00 101.96 107.60 112.29 113.04 111.78 108.24 101.96 100.00 101.96 108.24 109.67 111.62 109.71 104.61 101.96 100.00 101.96 108.12 116.15 116.97 117.85 107.67 101.96 100.00 101.96 108.24 107.11 107.45 110.21 108.24 101.96
+Classic/Triggers/L = `Full Axis 2+`
+Classic/Triggers/R = `Full Axis 5+`
+Classic/Triggers/L-Analog = `Full Axis 2+`
+Classic/Triggers/R-Analog = `Full Axis 5+`
+IR/Vertical Offset = 12.0
+IR/Total Yaw = 19.0
+IR/Total Pitch = 22.0
IR/Up = `XInput2/0/Virtual core pointer:Cursor Y-`
IR/Down = `XInput2/0/Virtual core pointer:Cursor Y+`
IR/Left = `XInput2/0/Virtual core pointer:Cursor X-`
IR/Right = `XInput2/0/Virtual core pointer:Cursor X+`
-Shake/X = `Full Axis 5+`
-Shake/Y = `Full Axis 5+`
-Shake/Z = `Full Axis 5+`
+IR/Hide = THUMBL
+IR/Calibration = 100.00 101.96 108.24 112.67 116.44 114.62 108.11 101.96 100.00 101.96 108.11 113.10 115.81 113.90 108.24 101.96 100.00 101.96 108.24 114.93 115.13 115.19 108.24 101.96 100.00 101.96 108.13 112.88 112.20 110.97 108.24 101.96
+Tilt/Modifier/Range = 50.0
+IMUAccelerometer/Up = `Accel Up`
+IMUAccelerometer/Down = `Accel Down`
+IMUAccelerometer/Left = `Accel Left`
+IMUAccelerometer/Right = `Accel Right`
+IMUAccelerometer/Forward = `Accel Forward`
+IMUAccelerometer/Backward = `Accel Backward`
+IMUGyroscope/Pitch Up = `Gyro Pitch Up`
+IMUGyroscope/Pitch Down = `Gyro Pitch Down`
+IMUGyroscope/Roll Left = `Gyro Roll Left`
+IMUGyroscope/Roll Right = `Gyro Roll Right`
+IMUGyroscope/Yaw Left = `Gyro Yaw Left`
+IMUGyroscope/Yaw Right = `Gyro Yaw Right`
+IMUIR/Enabled = False
+Nunchuk/Stick/Modifier/Range = 50.0
+Nunchuk/Tilt/Modifier/Range = 50.0
+Guitar/Stick/Modifier/Range = 50.0
+Drums/Stick/Modifier/Range = 50.0
+Turntable/Stick/Modifier/Range = 50.0
+uDraw/Stylus/Modifier/Range = 50.0
+Drawsome/Stylus/Modifier/Range = 50.0
+Tilt/Forward = @(`Full Axis 2+`+`Axis 4-`)
+Tilt/Backward = @(`Full Axis 2+`+`Axis 4+`)
+Tilt/Left = @(`Full Axis 2+`+`Axis 3-`)
+Tilt/Right = @(`Full Axis 2+`+`Axis 3+`)
[Wiimote2]
-Device = XInput2/0/Virtual core pointer
+Device = evdev/1/Valve Software Steam Deck Controller
+Source = 0
+BButtons/A = `SOUTH` | `Click 1` | `XInput2/1/Virtual core pointer:Click 1`
+Buttons/B = EAST
+Buttons/1 = WEST
+Buttons/2 = NORTH
+Buttons/- = SELECT
+Buttons/+ = START
+Buttons/Home = THUMBR
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
+Rumble/Motor = Strong
+Shake/X = TL
+Shake/Y = TL
+Shake/Z = TL
+Extension = Nunchuk
+Nunchuk/Stick/Up = `Axis 1-`
+Nunchuk/Stick/Down = `Axis 1+`
+Nunchuk/Stick/Left = `Axis 0-`
+Nunchuk/Stick/Right = `Axis 0+`
+Nunchuk/Buttons/C = TR
+Nunchuk/Buttons/Z = `Full Axis 5+` | `Full Axis 2+`
+Nunchuk/Shake/X = `TL`&`Full Axis 2+`
+Nunchuk/Shake/Y = `TL`&`Full Axis 2+`
+Nunchuk/Shake/Z = `TL`&`Full Axis 2+`
+Hotkeys/Sideways Toggle = `XInput2/1/Virtual core pointer:Alt`&`XInput2/1/Virtual core pointer:X`
+Hotkeys/Upright Toggle = `XInput2/1/Virtual core pointer:Alt_L`&`XInput2/1/Virtual core pointer:Z`
+Classic/Buttons/A = EAST
+Classic/Buttons/B = SOUTH
+Classic/Buttons/X = WEST
+Classic/Buttons/Y = NORTH
+Classic/Buttons/ZL = TL
+Classic/Buttons/ZR = TR
+Classic/Buttons/- = SELECT
+Classic/Buttons/+ = START
+Classic/Left Stick/Up = `Axis 1-`
+Classic/Left Stick/Down = `Axis 1+`
+Classic/Left Stick/Left = `Axis 0-`
+Classic/Left Stick/Right = `Axis 0+`
+Classic/Left Stick/Modifier/Range = 50.0
+Classic/Left Stick/Calibration = 100.00 101.96 107.63 112.05 110.67 111.78 105.49 101.89 100.00 101.96 108.24 112.08 112.34 109.50 107.04 101.96 100.00 101.96 106.95 114.00 115.73 117.91 108.24 101.96 100.00 101.96 108.24 106.97 109.81 109.07 108.24 101.96
+Classic/Right Stick/Up = `Axis 4-`
+Classic/Right Stick/Down = `Axis 4+`
+Classic/Right Stick/Left = `Axis 3-`
+Classic/Right Stick/Right = `Axis 3+`
+Classic/Right Stick/Modifier/Range = 50.0
+Classic/Right Stick/Calibration = 100.00 101.96 107.60 112.29 113.04 111.78 108.24 101.96 100.00 101.96 108.24 109.67 111.62 109.71 104.61 101.96 100.00 101.96 108.12 116.15 116.97 117.85 107.67 101.96 100.00 101.96 108.24 107.11 107.45 110.21 108.24 101.96
+Classic/Triggers/L = `Full Axis 2+`
+Classic/Triggers/R = `Full Axis 5+`
+Classic/Triggers/L-Analog = `Full Axis 2+`
+Classic/Triggers/R-Analog = `Full Axis 5+`
+IR/Vertical Offset = 12.0
+IR/Total Yaw = 19.0
+IR/Total Pitch = 22.0
+IR/Up = `XInput2/1/Virtual core pointer:Cursor Y-`
+IR/Down = `XInput2/1/Virtual core pointer:Cursor Y+`
+IR/Left = `XInput2/1/Virtual core pointer:Cursor X-`
+IR/Right = `XInput2/1/Virtual core pointer:Cursor X+`
+IR/Hide = THUMBL
+IR/Calibration = 100.00 101.96 108.24 112.67 116.44 114.62 108.11 101.96 100.00 101.96 108.11 113.10 115.81 113.90 108.24 101.96 100.00 101.96 108.24 114.93 115.13 115.19 108.24 101.96 100.00 101.96 108.13 112.88 112.20 110.97 108.24 101.96
Tilt/Modifier/Range = 50.0
+IMUAccelerometer/Up = `Accel Up`
+IMUAccelerometer/Down = `Accel Down`
+IMUAccelerometer/Left = `Accel Left`
+IMUAccelerometer/Right = `Accel Right`
+IMUAccelerometer/Forward = `Accel Forward`
+IMUAccelerometer/Backward = `Accel Backward`
+IMUGyroscope/Pitch Up = `Gyro Pitch Up`
+IMUGyroscope/Pitch Down = `Gyro Pitch Down`
+IMUGyroscope/Roll Left = `Gyro Roll Left`
+IMUGyroscope/Roll Right = `Gyro Roll Right`
+IMUGyroscope/Yaw Left = `Gyro Yaw Left`
+IMUGyroscope/Yaw Right = `Gyro Yaw Right`
+IMUIR/Enabled = False
Nunchuk/Stick/Modifier/Range = 50.0
Nunchuk/Tilt/Modifier/Range = 50.0
-Classic/Left Stick/Modifier/Range = 50.0
-Classic/Right Stick/Modifier/Range = 50.0
Guitar/Stick/Modifier/Range = 50.0
Drums/Stick/Modifier/Range = 50.0
Turntable/Stick/Modifier/Range = 50.0
uDraw/Stylus/Modifier/Range = 50.0
Drawsome/Stylus/Modifier/Range = 50.0
+Tilt/Forward = @(`Full Axis 2+`+`Axis 4-`)
+Tilt/Backward = @(`Full Axis 2+`+`Axis 4+`)
+Tilt/Left = @(`Full Axis 2+`+`Axis 3-`)
+Tilt/Right = @(`Full Axis 2+`+`Axis 3+`)
[Wiimote3]
-Device = XInput2/0/Virtual core pointer
+Device = evdev/0/Microsoft X-Box 360 pad 2
+Source = 0
+Buttons/A = `SOUTH` | `Click 1` | `XInput2/2/Virtual core pointer:Click 1`
+Buttons/B = EAST
+Buttons/1 = WEST
+Buttons/2 = NORTH
+Buttons/- = SELECT
+Buttons/+ = START
+Buttons/Home = THUMBR
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
+Rumble/Motor = Strong
+Shake/X = TL
+Shake/Y = TL
+Shake/Z = TL
+Extension = Nunchuk
+Nunchuk/Stick/Up = `Axis 1-`
+Nunchuk/Stick/Down = `Axis 1+`
+Nunchuk/Stick/Left = `Axis 0-`
+Nunchuk/Stick/Right = `Axis 0+`
+Nunchuk/Buttons/C = TR
+Nunchuk/Buttons/Z = `Full Axis 5+` | `Full Axis 2+`
+Nunchuk/Shake/X = `TL`&`Full Axis 2+`
+Nunchuk/Shake/Y = `TL`&`Full Axis 2+`
+Nunchuk/Shake/Z = `TL`&`Full Axis 2+`
+Hotkeys/Sideways Toggle = `XInput2/2/Virtual core pointer:Alt`&`XInput2/2/Virtual core pointer:X`
+Hotkeys/Upright Toggle = `XInput2/2/Virtual core pointer:Alt_L`&`XInput2/2/Virtual core pointer:Z`
+Classic/Buttons/A = EAST
+Classic/Buttons/B = SOUTH
+Classic/Buttons/X = WEST
+Classic/Buttons/Y = NORTH
+Classic/Buttons/ZL = TL
+Classic/Buttons/ZR = TR
+Classic/Buttons/- = SELECT
+Classic/Buttons/+ = START
+Classic/Left Stick/Up = `Axis 1-`
+Classic/Left Stick/Down = `Axis 1+`
+Classic/Left Stick/Left = `Axis 0-`
+Classic/Left Stick/Right = `Axis 0+`
+Classic/Left Stick/Modifier/Range = 50.0
+Classic/Left Stick/Calibration = 100.00 101.96 107.63 112.05 110.67 111.78 105.49 101.89 100.00 101.96 108.24 112.08 112.34 109.50 107.04 101.96 100.00 101.96 106.95 114.00 115.73 117.91 108.24 101.96 100.00 101.96 108.24 106.97 109.81 109.07 108.24 101.96
+Classic/Right Stick/Up = `Axis 4-`
+Classic/Right Stick/Down = `Axis 4+`
+Classic/Right Stick/Left = `Axis 3-`
+Classic/Right Stick/Right = `Axis 3+`
+Classic/Right Stick/Modifier/Range = 50.0
+Classic/Right Stick/Calibration = 100.00 101.96 107.60 112.29 113.04 111.78 108.24 101.96 100.00 101.96 108.24 109.67 111.62 109.71 104.61 101.96 100.00 101.96 108.12 116.15 116.97 117.85 107.67 101.96 100.00 101.96 108.24 107.11 107.45 110.21 108.24 101.96
+Classic/Triggers/L = `Full Axis 2+`
+Classic/Triggers/R = `Full Axis 5+`
+Classic/Triggers/L-Analog = `Full Axis 2+`
+Classic/Triggers/R-Analog = `Full Axis 5+`
+IR/Vertical Offset = 12.0
+IR/Total Yaw = 19.0
+IR/Total Pitch = 22.0
+IR/Up = `XInput2/2/Virtual core pointer:Cursor Y-`
+IR/Down = `XInput2/2/Virtual core pointer:Cursor Y+`
+IR/Left = `XInput2/2/Virtual core pointer:Cursor X-`
+IR/Right = `XInput2/2/Virtual core pointer:Cursor X+`
+IR/Hide = THUMBL
+IR/Calibration = 100.00 101.96 108.24 112.67 116.44 114.62 108.11 101.96 100.00 101.96 108.11 113.10 115.81 113.90 108.24 101.96 100.00 101.96 108.24 114.93 115.13 115.19 108.24 101.96 100.00 101.96 108.13 112.88 112.20 110.97 108.24 101.96
Tilt/Modifier/Range = 50.0
+IMUAccelerometer/Up = `Accel Up`
+IMUAccelerometer/Down = `Accel Down`
+IMUAccelerometer/Left = `Accel Left`
+IMUAccelerometer/Right = `Accel Right`
+IMUAccelerometer/Forward = `Accel Forward`
+IMUAccelerometer/Backward = `Accel Backward`
+IMUGyroscope/Pitch Up = `Gyro Pitch Up`
+IMUGyroscope/Pitch Down = `Gyro Pitch Down`
+IMUGyroscope/Roll Left = `Gyro Roll Left`
+IMUGyroscope/Roll Right = `Gyro Roll Right`
+IMUGyroscope/Yaw Left = `Gyro Yaw Left`
+IMUGyroscope/Yaw Right = `Gyro Yaw Right`
+IMUIR/Enabled = False
Nunchuk/Stick/Modifier/Range = 50.0
Nunchuk/Tilt/Modifier/Range = 50.0
-Classic/Left Stick/Modifier/Range = 50.0
-Classic/Right Stick/Modifier/Range = 50.0
Guitar/Stick/Modifier/Range = 50.0
Drums/Stick/Modifier/Range = 50.0
Turntable/Stick/Modifier/Range = 50.0
uDraw/Stylus/Modifier/Range = 50.0
Drawsome/Stylus/Modifier/Range = 50.0
+Tilt/Forward = @(`Full Axis 2+`+`Axis 4-`)
+Tilt/Backward = @(`Full Axis 2+`+`Axis 4+`)
+Tilt/Left = @(`Full Axis 2+`+`Axis 3-`)
+Tilt/Right = @(`Full Axis 2+`+`Axis 3+`)
[Wiimote4]
-Device = XInput2/0/Virtual core pointer
+Device = evdev/0/Microsoft X-Box 360 pad 4
+Source = 0
+Buttons/A = `SOUTH` | `Click 1` | `XInput2/3/Virtual core pointer:Click 1`
+Buttons/B = EAST
+Buttons/1 = WEST
+Buttons/2 = NORTH
+Buttons/- = SELECT
+Buttons/+ = START
+Buttons/Home = THUMBR
+D-Pad/Up = `Axis 7-`
+D-Pad/Down = `Axis 7+`
+D-Pad/Left = `Axis 6-`
+D-Pad/Right = `Axis 6+`
+Rumble/Motor = Strong
+Shake/X = TL
+Shake/Y = TL
+Shake/Z = TL
+Extension = Nunchuk
+Nunchuk/Stick/Up = `Axis 1-`
+Nunchuk/Stick/Down = `Axis 1+`
+Nunchuk/Stick/Left = `Axis 0-`
+Nunchuk/Stick/Right = `Axis 0+`
+Nunchuk/Buttons/C = TR
+Nunchuk/Buttons/Z = `Full Axis 5+` | `Full Axis 2+`
+Nunchuk/Shake/X = `TL`&`Full Axis 2+`
+Nunchuk/Shake/Y = `TL`&`Full Axis 2+`
+Nunchuk/Shake/Z = `TL`&`Full Axis 2+`
+Hotkeys/Sideways Toggle = `XInput2/3/Virtual core pointer:Alt`&`XInput2/2/Virtual core pointer:X`
+Hotkeys/Upright Toggle = `XInput2/3/Virtual core pointer:Alt_L`&`XInput2/2/Virtual core pointer:Z`
+Classic/Buttons/A = EAST
+Classic/Buttons/B = SOUTH
+Classic/Buttons/X = WEST
+Classic/Buttons/Y = NORTH
+Classic/Buttons/ZL = TL
+Classic/Buttons/ZR = TR
+Classic/Buttons/- = SELECT
+Classic/Buttons/+ = START
+Classic/Left Stick/Up = `Axis 1-`
+Classic/Left Stick/Down = `Axis 1+`
+Classic/Left Stick/Left = `Axis 0-`
+Classic/Left Stick/Right = `Axis 0+`
+Classic/Left Stick/Modifier/Range = 50.0
+Classic/Left Stick/Calibration = 100.00 101.96 107.63 112.05 110.67 111.78 105.49 101.89 100.00 101.96 108.24 112.08 112.34 109.50 107.04 101.96 100.00 101.96 106.95 114.00 115.73 117.91 108.24 101.96 100.00 101.96 108.24 106.97 109.81 109.07 108.24 101.96
+Classic/Right Stick/Up = `Axis 4-`
+Classic/Right Stick/Down = `Axis 4+`
+Classic/Right Stick/Left = `Axis 3-`
+Classic/Right Stick/Right = `Axis 3+`
+Classic/Right Stick/Modifier/Range = 50.0
+Classic/Right Stick/Calibration = 100.00 101.96 107.60 112.29 113.04 111.78 108.24 101.96 100.00 101.96 108.24 109.67 111.62 109.71 104.61 101.96 100.00 101.96 108.12 116.15 116.97 117.85 107.67 101.96 100.00 101.96 108.24 107.11 107.45 110.21 108.24 101.96
+Classic/Triggers/L = `Full Axis 2+`
+Classic/Triggers/R = `Full Axis 5+`
+Classic/Triggers/L-Analog = `Full Axis 2+`
+Classic/Triggers/R-Analog = `Full Axis 5+`
+IR/Vertical Offset = 12.0
+IR/Total Yaw = 19.0
+IR/Total Pitch = 22.0
+IR/Up = `XInput2/3/Virtual core pointer:Cursor Y-`
+IR/Down = `XInput2/3/Virtual core pointer:Cursor Y+`
+IR/Left = `XInput2/3/Virtual core pointer:Cursor X-`
+IR/Right = `XInput2/3/Virtual core pointer:Cursor X+`
+IR/Hide = THUMBL
+IR/Calibration = 100.00 101.96 108.24 112.67 116.44 114.62 108.11 101.96 100.00 101.96 108.11 113.10 115.81 113.90 108.24 101.96 100.00 101.96 108.24 114.93 115.13 115.19 108.24 101.96 100.00 101.96 108.13 112.88 112.20 110.97 108.24 101.96
Tilt/Modifier/Range = 50.0
+IMUAccelerometer/Up = `Accel Up`
+IMUAccelerometer/Down = `Accel Down`
+IMUAccelerometer/Left = `Accel Left`
+IMUAccelerometer/Right = `Accel Right`
+IMUAccelerometer/Forward = `Accel Forward`
+IMUAccelerometer/Backward = `Accel Backward`
+IMUGyroscope/Pitch Up = `Gyro Pitch Up`
+IMUGyroscope/Pitch Down = `Gyro Pitch Down`
+IMUGyroscope/Roll Left = `Gyro Roll Left`
+IMUGyroscope/Roll Right = `Gyro Roll Right`
+IMUGyroscope/Yaw Left = `Gyro Yaw Left`
+IMUGyroscope/Yaw Right = `Gyro Yaw Right`
+IMUIR/Enabled = False
Nunchuk/Stick/Modifier/Range = 50.0
Nunchuk/Tilt/Modifier/Range = 50.0
-Classic/Left Stick/Modifier/Range = 50.0
-Classic/Right Stick/Modifier/Range = 50.0
Guitar/Stick/Modifier/Range = 50.0
Drums/Stick/Modifier/Range = 50.0
Turntable/Stick/Modifier/Range = 50.0
uDraw/Stylus/Modifier/Range = 50.0
Drawsome/Stylus/Modifier/Range = 50.0
+Tilt/Forward = @(`Full Axis 2+`+`Axis 4-`)
+Tilt/Backward = @(`Full Axis 2+`+`Axis 4+`)
+Tilt/Left = @(`Full Axis 2+`+`Axis 3-`)
+Tilt/Right = @(`Full Axis 2+`+`Axis 3+`)
[BalanceBoard]
Device = XInput2/0/Virtual core pointer
+Source = 0
Tilt/Modifier/Range = 50.0
Nunchuk/Stick/Modifier/Range = 50.0
Nunchuk/Tilt/Modifier/Range = 50.0
@@ -87,4 +362,4 @@ Guitar/Stick/Modifier/Range = 50.0
Drums/Stick/Modifier/Range = 50.0
Turntable/Stick/Modifier/Range = 50.0
uDraw/Stylus/Modifier/Range = 50.0
-Drawsome/Stylus/Modifier/Range = 50.0
\ No newline at end of file
+Drawsome/Stylus/Modifier/Range = 50.0
diff --git a/emu-configs/duckstation/settings.ini b/emu-configs/duckstation/settings.ini
index a3ab2d70..0936a2e7 100644
--- a/emu-configs/duckstation/settings.ini
+++ b/emu-configs/duckstation/settings.ini
@@ -43,14 +43,16 @@ FastmemMode = true
[GPU]
Renderer = Vulkan
+Adapter = AMD RADV VANGOGH
ResolutionScale = 3
Multisamples = 1
UseDebugDevice = false
UseSoftwareRendererForReadbacks = false
+UseSoftwareRendererForReadbacks = false
PerSampleShading = false
UseThread = true
ThreadedPresentation = true
-TrueColor = false
+TrueColor = true
ScaledDithering = true
TextureFilter = Nearest
DownsampleMode = Disabled
@@ -87,12 +89,15 @@ ShowFPS = false
ShowVPS = false
ShowSpeed = false
ShowResolution = false
+ShowCPU = false
+ShowGPU = false
ShowStatusIndicators = true
+ShowInputs = false
ShowEnhancements = false
Fullscreen = false
-VSync = false
+VSync = true
DisplayAllFrames = false
-PostProcessChain =
+PostProcessChain =
MaxFPS = 0.000000
InternalResolutionScreenshots = false
@@ -101,6 +106,7 @@ InternalResolutionScreenshots = false
ReadaheadSectors = 8
RegionCheck = false
LoadImageToRAM = false
+LoadImagePatches = false
MuteCDAudio = false
ReadSpeedup = 1
SeekSpeedup = 1
@@ -188,12 +194,17 @@ Directory = RETRODECKHOMEDIR/saves/psx/duckstation/memcards
[ControllerPorts]
+ControllerSettingsMigrated = true
MultitapMode = Disabled
+PointerXScale = 8
+PointerYScale = 8
+PointerXInvert = false
+PointerYInvert = false
[Logging]
LogLevel = Info
-LogFilter =
+LogFilter =
LogToConsole = true
LogToDebug = false
LogToWindow = false
@@ -212,6 +223,15 @@ ShowMDECState = false
ShowDMAState = false
+[TextureReplacements]
+EnableVRAMWriteReplacements = false
+PreloadTextures = false
+DumpVRAMWrites = false
+DumpVRAMWriteForceAlphaChannel = true
+DumpVRAMWriteWidthThreshold = 128
+DumpVRAMWriteHeightThreshold = 128
+
+
[Hacks]
DMAMaxSliceTicks = 1000
DMAHaltTicks = 100
@@ -219,31 +239,6 @@ GPUFIFOSize = 16
GPUMaxRunAhead = 128
-[Hotkeys]
-OpenQuickMenu = Keyboard/Control & Keyboard/M
-FastForward = Keyboard/Control & Keyboard/Plus
-ToggleTurbo = Keyboard/Control & Keyboard/T
-ToggleFullscreen = Keyboard/Control & Keyboard/Return
-TogglePause = Keyboard/Control & Keyboard/P
-Screenshot = Keyboard/Control & Keyboard/X
-Reset = Keyboard/Control & Keyboard/R
-ChangeDisc = Keyboard/Control & Keyboard/D
-Rewind = Keyboard/Control & Keyboard/Minus
-ToggleCheats = Keyboard/Control & Keyboard/C
-IncreaseEmulationSpeed = Keyboard/Control & Keyboard/1
-DecreaseEmulationSpeed = Keyboard/Control & Keyboard/2
-ResetEmulationSpeed = Keyboard/Control & Keyboard/3
-IncreaseResolutionScale = Keyboard/Control & Keyboard/U
-DecreaseResolutionScale = Keyboard/Control & Keyboard/Y
-ToggleWidescreen = Keyboard/Control & Keyboard/W
-LoadSelectedSaveState = Keyboard/Control & Keyboard/A
-SaveSelectedSaveState = Keyboard/Control & Keyboard/S
-SelectPreviousSaveStateSlot = Keyboard/Control & Keyboard/J
-SelectNextSaveStateSlot = Keyboard/Control & Keyboard/K
-PowerOff = Keyboard/Control & Keyboard/Q
-UndoLoadState = Keyboard/Control & Keyboard/9
-
-
[Cheevos]
Enabled = false
TestMode = false
@@ -261,9 +256,168 @@ LoginTimestamp =
[UI]
-MainWindowGeometry = AdnQywADAAAAAAAlAAAAHAAAA0QAAAL0AAAAJQAAADkAAANEAAAC9AAAAAAAAAAAB4AAAAAlAAAAOQAAA0QAAAL0
+MainWindowGeometry = AdnQywADAAAAAAhwAAABXwAAC48AAAQKAAAIcAAAAXwAAAuPAAAECgAAAAAAAAAACgAAAAhwAAABfAAAC48AAAQK
MainWindowState = AAAA/wAAAAD9AAAAAAAAAyAAAAI9AAAABAAAAAQAAAAIAAAACPwAAAABAAAAAgAAAAEAAAAOAHQAbwBvAGwAQgBhAHIBAAAAAP////8AAAAAAAAAAA==
[GameList]
RecursivePaths = RETRODECKHOMEDIR/roms/psx
+
+
+[InputSources]
+SDL = true
+SDLControllerEnhancedMode = false
+XInput = false
+RawInput = false
+
+
+[Pad1]
+Type = AnalogController
+Up = SDL-0/DPadUp
+Right = SDL-0/DPadRight
+Down = SDL-0/DPadDown
+Left = SDL-0/DPadLeft
+Triangle = SDL-0/Y
+Circle = SDL-0/B
+Cross = SDL-0/A
+Square = SDL-0/X
+Select = SDL-0/Back
+Start = SDL-0/Start
+L1 = SDL-0/LeftShoulder
+R1 = SDL-0/RightShoulder
+L2 = SDL-0/+LeftTrigger
+R2 = SDL-0/+RightTrigger
+Analog = Keyboard/F6
+L3 = SDL-0/LeftStick
+R3 = SDL-0/RightStick
+LLeft = SDL-0/-LeftX
+LRight = SDL-0/+LeftX
+LDown = SDL-0/+LeftY
+LUp = SDL-0/-LeftY
+RLeft = SDL-0/-RightX
+RRight = SDL-0/+RightX
+RDown = SDL-0/+RightY
+RUp = SDL-0/-RightY
+SmallMotor = SDL-0/SmallMotor
+LargeMotor = SDL-0/LargeMotor
+
+
+[Pad2]
+Type = AnalogController
+Up = SDL-1/DPadUp
+Right = SDL-1/DPadRight
+Down = SDL-1/DPadDown
+Left = SDL-1/DPadLeft
+Triangle = SDL-1/Y
+Circle = SDL-1/B
+Cross = SDL-1/A
+Square = SDL-1/X
+Select = SDL-1/Back
+Start = SDL-1/Start
+Analog = SDL-1/Guide
+L1 = SDL-1/LeftShoulder
+R1 = SDL-1/RightShoulder
+L2 = SDL-1/+LeftTrigger
+R2 = SDL-1/+RightTrigger
+L3 = SDL-1/LeftStick
+R3 = SDL-1/RightStick
+LLeft = SDL-1/-LeftX
+LRight = SDL-1/+LeftX
+LDown = SDL-1/+LeftY
+LUp = SDL-1/-LeftY
+RLeft = SDL-1/-RightX
+RRight = SDL-1/+RightX
+RDown = SDL-1/+RightY
+RUp = SDL-1/-RightY
+SmallMotor = SDL-1/SmallMotor
+LargeMotor = SDL-1/LargeMotor
+
+
+[Pad3]
+Type = AnalogController
+Up = SDL-2/DPadUp
+Right = SDL-2/DPadRight
+Down = SDL-2/DPadDown
+Left = SDL-2/DPadLeft
+Triangle = SDL-2/Y
+Circle = SDL-2/B
+Cross = SDL-2/A
+Square = SDL-2/X
+Select = SDL-2/Back
+Start = SDL-2/Start
+Analog = SDL-2/Guide
+L1 = SDL-2/LeftShoulder
+R1 = SDL-2/RightShoulder
+L2 = SDL-2/+LeftTrigger
+R2 = SDL-2/+RightTrigger
+L3 = SDL-2/LeftStick
+R3 = SDL-2/RightStick
+LLeft = SDL-2/-LeftX
+LRight = SDL-2/+LeftX
+LDown = SDL-2/+LeftY
+LUp = SDL-2/-LeftY
+RLeft = SDL-2/-RightX
+RRight = SDL-2/+RightX
+RDown = SDL-2/+RightY
+RUp = SDL-2/-RightY
+SmallMotor = SDL-2/SmallMotor
+LargeMotor = SDL-2/LargeMotor
+
+
+[Pad4]
+Type = AnalogController
+Up = SDL-3/DPadUp
+Right = SDL-3/DPadRight
+Down = SDL-3/DPadDown
+Left = SDL-3/DPadLeft
+Triangle = SDL-3/Y
+Circle = SDL-3/B
+Cross = SDL-3/A
+Square = SDL-3/X
+Select = SDL-3/Back
+Start = SDL-3/Start
+Analog = SDL-3/Guide
+L1 = SDL-3/LeftShoulder
+R1 = SDL-3/RightShoulder
+L2 = SDL-3/+LeftTrigger
+R2 = SDL-3/+RightTrigger
+L3 = SDL-3/LeftStick
+R3 = SDL-3/RightStick
+LLeft = SDL-3/-LeftX
+LRight = SDL-3/+LeftX
+LDown = SDL-3/+LeftY
+LUp = SDL-3/-LeftY
+RLeft = SDL-3/-RightX
+RRight = SDL-3/+RightX
+RDown = SDL-3/+RightY
+RUp = SDL-3/-RightY
+SmallMotor = SDL-3/SmallMotor
+LargeMotor = SDL-3/LargeMotor
+
+
+[Pad5]
+Type = None
+
+
+[Pad6]
+Type = None
+
+
+[Pad7]
+Type = None
+
+
+[Pad8]
+Type = None
+
+
+[Hotkeys]
+FastForward = Keyboard/Tab
+TogglePause = Keyboard/Space
+Screenshot = Keyboard/F10
+ToggleFullscreen = Keyboard/F11
+OpenPauseMenu = Keyboard/Escape
+LoadSelectedSaveState = Keyboard/F1
+SaveSelectedSaveState = Keyboard/F2
+SelectPreviousSaveStateSlot = Keyboard/F3
+SelectNextSaveStateSlot = Keyboard/F4
diff --git a/emu-configs/gzdoom/gzdoom.ini b/emu-configs/gzdoom/gzdoom.ini
index 8e6b317d..5508033a 100644
--- a/emu-configs/gzdoom/gzdoom.ini
+++ b/emu-configs/gzdoom/gzdoom.ini
@@ -1,4 +1,4 @@
-# This file was generated by GZDoom g4.11.3-m on 2023-11-25 14:33:14
+# This file was generated by GZDoom g4.11.3-m on 2024-03-10 09:34:01
# These are the directories to automatically search for IWADs.
# Each directory should be on a separate line, preceded by Path=
[IWADSearch.Directories]
@@ -6,8 +6,6 @@ Path=.
Path=$DOOMWADDIR
Path=$HOME
Path=$PROGDIR
-Path=/var/config/gzdoom
-Path=/var/data/gzdoom
Path=RETRODECKROMSDIR/doom
Path=/app/share/games/doom/
@@ -17,16 +15,22 @@ Path=/app/share/games/doom/
[FileSearch.Directories]
Path=$PROGDIR
Path=$DOOMWADDIR
-Path=/var/config/gzdoom
-Path=/var/data/gzdoom
Path=RETRODECKROMSDIR/doom
+Path=RETRODECKROMSDIR/bios/gzdoom
Path=/app/share/games/doom/
+Path=/var/config/gzdoom
# These are the directories to search for soundfonts that let listed in the menu.
# Layout is the same as for IWADSearch.Directories
[SoundfontSearch.Directories]
Path=$PROGDIR/soundfonts
Path=$PROGDIR/fm_banks
+Path=RETRODECKROMSDIR/bios/gzdoom
+Path=/var/data/gzdoom/audio/soundfonts
+Path=/var/data/gzdoom/audio/fm_banks
+Path=/var/data/gzdoom/audio
+Path=/app/share/games/doom/soundfonts
+Path=/app/share/games/doom/fm_banks
Path=/var/data/gzdoom
# Files to automatically execute when running the corresponding game.
@@ -169,7 +173,7 @@ adl_volume_model=0
autoloadbrightmaps=false
autoloadlights=false
autoloadwidescreen=true
-autosavecount=4
+autosavecount=1
autosavenum=0
chase_dist=90
chase_height=-8
@@ -203,7 +207,7 @@ fluid_chorus_voices=3
fluid_gain=0.5
fluid_interp=1
fluid_lib=
-fluid_patchset=/app/share/sounds/sf2/gzdoom.sf2
+fluid_patchset=/app/share/games/doom/soundfonts/gzdoom.sf2
fluid_reverb=false
fluid_reverb_damping=0.23
fluid_reverb_level=0.57
@@ -253,7 +257,7 @@ gl_sprite_blend=false
gl_ssao=0
gl_ssao_portals=1
gl_ssao_strength=0.7
-gl_texture_filter=4
+gl_texture_filter=0
gl_texture_filter_anisotropic=8
gl_texture_hqresize_maxinputsize=512
gl_texture_hqresize_mt_height=4
@@ -265,7 +269,7 @@ gl_texture_hqresizemult=1
gl_usecolorblending=true
gme_stereodepth=0
gus_memsize=0
-gus_patchdir=
+gus_patchdir=/data/gzdoom/midi
i_discordrpc=false
i_pauseinbackground=true
i_soundinbackground=false
@@ -284,7 +288,7 @@ m_sensitivity_y=2
m_show_backbutton=0
m_showinputgrid=0
m_side=2
-m_simpleoptions=true
+m_simpleoptions=false
m_use_mouse=2
m_yaw=1
map_point_coordinates=true
@@ -313,7 +317,7 @@ opn_chips_count=8
opn_emulator_id=0
opn_fullpan=true
opn_run_at_pcm_rate=false
-os_isanyof=true
+os_isanyof=false
png_gamma=0
png_level=5
queryiwad=true
@@ -343,7 +347,7 @@ r_skipmats=false
r_sprite_distance_cull=0
r_spriteadjust=2
r_ticstability=true
-save_dir=RETRODECKSAVESDIR/doom/gzdoom
+save_dir=RETRODECKHOMEDIR/saves/doom/gzdoom
save_formatted=false
saveloadconfirmation=true
savestatistics=0
@@ -374,7 +378,7 @@ strictdecorate=false
telezoom=true
timidity_channel_pressure=false
timidity_chorus=0
-timidity_config=gzdoom
+timidity_config=/app/share/games/doom/soundfonts/gzdoom.sf2
timidity_drum_effect=false
timidity_drum_power=1
timidity_key_adjust=0
@@ -398,7 +402,7 @@ use_joystick=true
use_mouse=true
vid_activeinbackground=false
vid_adapter=0
-vid_aspect=0
+vid_aspect=2
vid_brightness=0
vid_contrast=1
vid_cropaspect=false
@@ -411,12 +415,12 @@ vid_maxfps=200
vid_preferbackend=1
vid_rendermode=4
vid_saturation=1
-vid_scale_customheight=200
+vid_scale_customheight=800
vid_scale_custompixelaspect=1
-vid_scale_customwidth=320
+vid_scale_customwidth=1280
vid_scale_linear=false
vid_scalefactor=1
-vid_scalemode=0
+vid_scalemode=5
vid_sdl_render_driver=
vid_vsync=false
vk_debug=false
@@ -430,14 +434,14 @@ vr_ipd=0.062
vr_mode=0
vr_screendist=0.8
vr_swap_eyes=false
-wildmidi_config=
+wildmidi_config=/app/share/games/doom/soundfonts/gzdoom.sf2
wildmidi_enhanced_resampling=true
wildmidi_reverb=false
-win_h=640
-win_maximized=false
-win_w=1024
-win_x=-1
-win_y=-1
+win_h=800
+win_maximized=true
+win_w=1280
+win_x=0
+win_y=0
xbrz_centerdirectionbias=4
xbrz_colorformat=0
xbrz_dominantdirectionthreshold=3.6
@@ -474,7 +478,7 @@ gender=other
movebob=0.25
name=RetroDECK
neverswitchonpickup=false
-playerclass=Fighter
+playerclass=Pistol Start
skin=base
stillbob=0
team=255
@@ -594,7 +598,7 @@ cl_showsecretmessage=true
cl_showsprees=true
cl_spreaddecals=true
classic_scaling_factor=1
-classic_scaling_pixelaspect=1.2
+classic_scaling_pixelaspect=1
compatmode=0
con_alpha=0.75
con_centernotify=false
@@ -604,12 +608,12 @@ con_notifytime=3
con_pulsetext=false
con_scale=0
con_scaletext=0
-crosshair=0
+crosshair=1
crosshaircolor=ff 00 00
crosshairforce=false
crosshairgrow=false
crosshairhealth=2
-crosshairon=true
+crosshairon=false
crosshairscale=0.5
dehload=0
dimamount=-1
@@ -729,12 +733,12 @@ ui_screenborder_classic_scaling=true
uiscale=0
underwater_fade_scalar=1
vid_allowtrueultrawide=1
-vid_cursor=None
+vid_cursor=doomcurs
vid_nopalsubstitutions=false
wi_cleantextscale=false
wi_percents=true
wi_showtotaltime=true
-wipetype=1
+wipetype=0
[Doom.LocalServerInfo]
compatflags=0
@@ -770,8 +774,6 @@ Tab=togglemap
W=+forward
E=+use
T=messagemode
-LeftBracket=invprev
-RightBracket=invnext
Enter=invuse
A=+moveleft
S=+back
@@ -806,31 +808,15 @@ Mouse1=+attack
Mouse2=+altattack
MWheelUp=weapprev
MWheelDown=weapnext
-MWheelRight=invnext
-MWheelLeft=invprev
-DPadUp=togglemap
-DPadDown=invuse
-DPadLeft=invprev
-DPadRight=invnext
-Pad_Start=pause
-Pad_Back=menu_main
-LShoulder=weapprev
-RShoulder=weapnext
-LTrigger=+altattack
-RTrigger=+attack
-Pad_A=+use
-Pad_Y=+jump
W=+forward
E=+use
A=+moveleft
S=+back
D=+moveright
-Q=di_taunttoggle
I=di_toggleinfrared
P=di_showupgrades_bind
F=di_useitem_bind
M=di_modscreen
-R=+reload
C=+crouch
,=di_prevSong
.=di_skipSong
@@ -839,13 +825,29 @@ LeftArrow=+moveleft
RightArrow=+moveright
DownArrow=+back
Joy1=+use
-Joy3=+reload
-Joy4=+jump
-Joy5=weapprev
-Joy6=weapnext
+Joy3=+crouch
+Joy4=+reload
+Joy6=+altattack
Joy8=menu_main
Joy10=toggle cl_run
-Joy11=crouch
+Joy11=turn180
+Axis1Plus=+moveright
+Axis1Minus=+moveleft
+Axis2Plus=+back
+Axis2Minus=+forward
+Joy2=+jump
+Joy7=togglemap
+POV1Up=invnext
+POV1Right=weapnext
+POV1Down=invuse
+POV1Left=weapprev
+Axis4Plus=+right
+Axis4Minus=+left
+Axis5Plus=+lookdown
+Axis5Minus=+lookup
+Axis6Plus=+attack
+Axis3Plus=di_modscreen
+Joy5=di_useitem_bind
[Doom.DoubleBindings]
@@ -870,13 +872,13 @@ MWheelDown=am_zoom -1.2
[Heretic.Player]
autoaim=35
classicflight=false
-color=3f 60 40
+color=40 cf 00
colorset=0
fov=90
fviewbob=true
gender=other
movebob=0.25
-name=PortaDOOM
+name=RetroDECK
neverswitchonpickup=false
playerclass=Fighter
skin=base
@@ -1170,13 +1172,10 @@ sv_smartaim=0
0=slot 0
-=sizedown
Equals=sizeup
-Backspace=use ArtiTomeOfPower
Tab=togglemap
W=+forward
E=+use
T=messagemode
-LeftBracket=invprev
-RightBracket=invnext
Enter=invuse
A=+moveleft
S=+back
@@ -1184,9 +1183,8 @@ D=+moveright
`=toggleconsole
Shift=+speed
\=+showscores
-C=crouch
-Space=+jump
CapsLock=toggle cl_run
+Space=+jump
F1=menu_help
F2=menu_save
F3=menu_load
@@ -1197,8 +1195,9 @@ F7=menu_endgame
F8=togglemessages
F9=quickload
F10=menu_quit
+Scroll=+showscores
F11=bumpgamma
-F12=screenshot
+F12=spynext
SysRq=screenshot
Pause=pause
Home=land
@@ -1211,35 +1210,39 @@ Mouse1=+attack
Mouse2=+altattack
MWheelUp=weapprev
MWheelDown=weapnext
-MWheelRight=invnext
-MWheelLeft=invprev
-DPadUp=togglemap
-DPadDown=invuse
-DPadLeft=invprev
-DPadRight=invnext
-Pad_Start=pause
-Pad_Back=menu_main
-LShoulder=weapprev
-RShoulder=weapnext
-LTrigger=+altattack
-RTrigger=+attack
-Pad_A=+use
-Pad_Y=+jump
-Q=+zoom
-R=+reload
+W=+forward
+E=+use
+A=+moveleft
+S=+back
+D=+moveright
C=+crouch
UpArrow=+forward
LeftArrow=+moveleft
RightArrow=+moveright
DownArrow=+back
Joy1=+use
-Joy3=+reload
-Joy4=+jump
-Joy5=weapprev
-Joy6=weapnext
+Joy3=+crouch
+Joy4=+reload
+Joy5=+zoom
+Joy6=+altattack
Joy8=menu_main
Joy10=toggle cl_run
-Joy11=crouch
+Joy11=turn180
+Axis1Plus=+moveright
+Axis1Minus=+moveleft
+Axis2Plus=+back
+Axis2Minus=+forward
+Joy2=+jump
+Joy7=togglemap
+POV1Up=invnext
+POV1Right=weapnext
+POV1Down=invuse
+POV1Left=weapprev
+Axis4Plus=+right
+Axis4Minus=+left
+Axis5Plus=+lookdown
+Axis5Minus=+lookup
+Axis6Plus=+attack
[Heretic.DoubleBindings]
@@ -1272,7 +1275,7 @@ gender=other
movebob=0.25
name=PortaDOOM
neverswitchonpickup=false
-playerclass=Cleric
+playerclass=Mage
skin=base
stillbob=0
team=255
@@ -1556,27 +1559,26 @@ sv_smartaim=0
2=slot 2
3=slot 3
4=slot 4
-5=use ArtiInvulnerability2
-6=use ArtiPork
-7=use ArtiTeleportOther
-8=use ArtiTeleport
-9=use ArtiBlastRadius
-0=useflechette
+5=slot 5
+6=slot 6
+7=slot 7
+8=slot 8
+9=slot 9
+0=slot 0
-=sizedown
Equals=sizeup
Tab=togglemap
W=+forward
E=+use
T=messagemode
-LeftBracket=invprev
-RightBracket=invnext
Enter=invuse
A=+moveleft
S=+back
D=+moveright
`=toggleconsole
Shift=+speed
-\=use ArtiHealth
+\=+showscores
+CapsLock=toggle cl_run
Space=+jump
F1=menu_help
F2=menu_save
@@ -1590,7 +1592,7 @@ F9=quickload
F10=menu_quit
Scroll=+showscores
F11=bumpgamma
-F12=screenshot
+F12=spynext
SysRq=screenshot
Pause=pause
Home=land
@@ -1603,46 +1605,39 @@ Mouse1=+attack
Mouse2=+altattack
MWheelUp=weapprev
MWheelDown=weapnext
-MWheelRight=invnext
-MWheelLeft=invprev
-DPadUp=togglemap
-DPadDown=invuse
-DPadLeft=invprev
-DPadRight=invnext
-Pad_Start=pause
-Pad_Back=menu_main
-LShoulder=weapprev
-RShoulder=weapnext
-LTrigger=+altattack
-RTrigger=+attack
-Pad_A=+use
-Pad_Y=+jump
W=+forward
E=+use
A=+moveleft
S=+back
D=+moveright
-Q=di_taunttoggle
-I=di_toggleinfrared
-P=di_showupgrades_bind
-F=di_useitem_bind
-M=di_modscreen
-R=+reload
C=+crouch
-,=di_prevSong
-.=di_skipSong
UpArrow=+forward
LeftArrow=+moveleft
RightArrow=+moveright
DownArrow=+back
Joy1=+use
-Joy3=+reload
-Joy4=+jump
-Joy5=weapprev
-Joy6=weapnext
+Joy3=+crouch
+Joy4=+reload
+Joy5=+zoom
+Joy6=+altattack
Joy8=menu_main
Joy10=toggle cl_run
-Joy11=crouch
+Joy11=turn180
+Axis1Plus=+moveright
+Axis1Minus=+moveleft
+Axis2Plus=+back
+Axis2Minus=+forward
+Joy2=+jump
+Joy7=togglemap
+POV1Up=invnext
+POV1Right=weapnext
+POV1Down=invuse
+POV1Left=weapprev
+Axis4Plus=+right
+Axis4Minus=+left
+Axis5Plus=+lookdown
+Axis5Minus=+lookup
+Axis6Plus=+attack
[Hexen.DoubleBindings]
@@ -1670,9 +1665,10 @@ classicflight=false
color=40 cf 00
colorset=0
fov=90
+fviewbob=true
gender=other
movebob=0.25
-name=PortaDOOM
+name=RetroDECK
neverswitchonpickup=false
playerclass=Fighter
skin=base
@@ -1702,6 +1698,7 @@ am_gridcolor=8b 5a 2b
am_interlevelcolor=ff 00 00
am_intralevelcolor=00 00 ff
am_linealpha=1
+am_lineantialiasing=0
am_linethickness=1
am_lockedcolor=00 78 00
am_map_secrets=1
@@ -1793,7 +1790,7 @@ cl_showsecretmessage=true
cl_showsprees=true
cl_spreaddecals=true
classic_scaling_factor=1
-classic_scaling_pixelaspect=1.2000000476837158
+classic_scaling_pixelaspect=1.2
compatmode=0
con_alpha=0.75
con_centernotify=false
@@ -1819,14 +1816,14 @@ dlg_vgafont=false
gl_aalines=false
gl_bandedswlight=false
gl_bloom=false
-gl_bloom_amount=1.399999976158142
+gl_bloom_amount=1.4
gl_brightfog=false
gl_coronas=true
gl_enhanced_nightvision=true
-gl_exposure_base=0.3499999940395355
-gl_exposure_min=0.3499999940395355
-gl_exposure_scale=1.2999999523162842
-gl_exposure_speed=0.05000000074505806
+gl_exposure_base=0.35
+gl_exposure_min=0.35
+gl_exposure_scale=1.3
+gl_exposure_speed=0.05
gl_fogmode=2
gl_fuzztype=0
gl_interpolate_model_frames=true
@@ -1838,7 +1835,7 @@ gl_paltonemap_powtable=2
gl_paltonemap_reverselookup=true
gl_precache=false
gl_scale_viewport=true
-gl_sclipfactor=1.7999999523162842
+gl_sclipfactor=1.8
gl_sclipthreshold=10
gl_spriteclip=1
gl_tonemap=0
@@ -1919,7 +1916,7 @@ sb_teamdeathmatch_headingcolor=6
screenblocks=11
setslotstrict=true
show_obituaries=true
-snd_menuvolume=0.6000000238418579
+snd_menuvolume=0.6
snd_pitched=false
st_oldouch=false
st_scale=-1
@@ -1965,27 +1962,19 @@ sv_smartaim=0
0=slot 0
-=sizedown
Equals=sizeup
-Backspace=invdrop
Tab=togglemap
-Q=+zoom
W=+forward
E=+use
T=messagemode
-LeftBracket=invprev
-RightBracket=invnext
Enter=invuse
A=+moveleft
S=+back
D=+moveright
-K=showpop 2
`=toggleconsole
Shift=+speed
\=+showscores
-Z=showpop 3
-X=crouch
-C=+crouch
-Space=+jump
CapsLock=toggle cl_run
+Space=+jump
F1=menu_help
F2=menu_save
F3=menu_load
@@ -1996,8 +1985,9 @@ F7=menu_endgame
F8=togglemessages
F9=quickload
F10=menu_quit
+Scroll=+showscores
F11=bumpgamma
-F12=screenshot
+F12=spynext
SysRq=screenshot
Pause=pause
Home=land
@@ -2010,33 +2000,39 @@ Mouse1=+attack
Mouse2=+altattack
MWheelUp=weapprev
MWheelDown=weapnext
-MWheelRight=invnext
-MWheelLeft=invprev
-DPadUp=togglemap
-DPadDown=invuse
-DPadLeft=invprev
-DPadRight=invnext
-Pad_Start=pause
-Pad_Back=menu_main
-LShoulder=weapprev
-RShoulder=weapnext
-LTrigger=+altattack
-RTrigger=+attack
-Pad_A=+use
-Pad_Y=+jump
-R=+reload
+W=+forward
+E=+use
+A=+moveleft
+S=+back
+D=+moveright
+C=+crouch
UpArrow=+forward
LeftArrow=+moveleft
RightArrow=+moveright
DownArrow=+back
Joy1=+use
-Joy3=+reload
-Joy4=+jump
-Joy5=weapprev
-Joy6=weapnext
+Joy3=+crouch
+Joy4=+reload
+Joy5=+zoom
+Joy6=+altattack
Joy8=menu_main
Joy10=toggle cl_run
-Joy11=crouch
+Joy11=turn180
+Axis1Plus=+moveright
+Axis1Minus=+moveleft
+Axis2Plus=+back
+Axis2Minus=+forward
+Joy2=+jump
+Joy7=togglemap
+POV1Up=invnext
+POV1Right=weapnext
+POV1Down=invuse
+POV1Left=weapprev
+Axis4Plus=+right
+Axis4Minus=+left
+Axis5Plus=+lookdown
+Axis5Minus=+lookup
+Axis6Plus=+attack
[Strife.DoubleBindings]
@@ -2064,9 +2060,10 @@ classicflight=false
color=40 cf 00
colorset=0
fov=90
+fviewbob=true
gender=other
movebob=0.25
-name=PortaDOOM
+name=RetroDECK
neverswitchonpickup=false
playerclass=Fighter
skin=base
@@ -2096,6 +2093,7 @@ am_gridcolor=8b 5a 2b
am_interlevelcolor=ff 00 00
am_intralevelcolor=00 00 ff
am_linealpha=1
+am_lineantialiasing=0
am_linethickness=1
am_lockedcolor=00 78 00
am_map_secrets=1
@@ -2187,7 +2185,7 @@ cl_showsecretmessage=true
cl_showsprees=true
cl_spreaddecals=true
classic_scaling_factor=1
-classic_scaling_pixelaspect=1.2000000476837158
+classic_scaling_pixelaspect=1.2
compatmode=0
con_alpha=0.75
con_centernotify=false
@@ -2213,14 +2211,14 @@ dlg_vgafont=false
gl_aalines=false
gl_bandedswlight=false
gl_bloom=false
-gl_bloom_amount=1.399999976158142
+gl_bloom_amount=1.4
gl_brightfog=false
gl_coronas=true
gl_enhanced_nightvision=true
-gl_exposure_base=0.3499999940395355
-gl_exposure_min=0.3499999940395355
-gl_exposure_scale=1.2999999523162842
-gl_exposure_speed=0.05000000074505806
+gl_exposure_base=0.35
+gl_exposure_min=0.35
+gl_exposure_scale=1.3
+gl_exposure_speed=0.05
gl_fogmode=2
gl_fuzztype=0
gl_interpolate_model_frames=true
@@ -2232,7 +2230,7 @@ gl_paltonemap_powtable=2
gl_paltonemap_reverselookup=true
gl_precache=false
gl_scale_viewport=true
-gl_sclipfactor=1.7999999523162842
+gl_sclipfactor=1.8
gl_sclipthreshold=10
gl_spriteclip=1
gl_tonemap=0
@@ -2313,7 +2311,7 @@ sb_teamdeathmatch_headingcolor=6
screenblocks=11
setslotstrict=true
show_obituaries=true
-snd_menuvolume=0.6000000238418579
+snd_menuvolume=0.6
snd_pitched=false
st_oldouch=false
st_scale=-1
@@ -2363,8 +2361,6 @@ Tab=togglemap
W=+forward
E=+use
T=messagemode
-LeftBracket=invprev
-RightBracket=invnext
Enter=invuse
A=+moveleft
S=+back
@@ -2372,9 +2368,8 @@ D=+moveright
`=toggleconsole
Shift=+speed
\=+showscores
-X=crouch
-Space=+jump
CapsLock=toggle cl_run
+Space=+jump
F1=menu_help
F2=menu_save
F3=menu_load
@@ -2385,8 +2380,9 @@ F7=menu_endgame
F8=togglemessages
F9=quickload
F10=menu_quit
+Scroll=+showscores
F11=bumpgamma
-F12=screenshot
+F12=spynext
SysRq=screenshot
Pause=pause
Home=land
@@ -2399,24 +2395,39 @@ Mouse1=+attack
Mouse2=+altattack
MWheelUp=weapprev
MWheelDown=weapnext
-MWheelRight=invnext
-MWheelLeft=invprev
-DPadUp=togglemap
-DPadDown=invuse
-DPadLeft=invprev
-DPadRight=invnext
-Pad_Start=pause
-Pad_Back=menu_main
-LThumb=crouch
-LShoulder=weapprev
-RShoulder=weapnext
-LTrigger=+altattack
-RTrigger=+attack
-Pad_A=+use
-Pad_Y=+jump
-Q=+zoom
-R=+reload
+W=+forward
+E=+use
+A=+moveleft
+S=+back
+D=+moveright
C=+crouch
+UpArrow=+forward
+LeftArrow=+moveleft
+RightArrow=+moveright
+DownArrow=+back
+Joy1=+use
+Joy3=+crouch
+Joy4=+reload
+Joy5=+zoom
+Joy6=+altattack
+Joy8=menu_main
+Joy10=toggle cl_run
+Joy11=turn180
+Axis1Plus=+moveright
+Axis1Minus=+moveleft
+Axis2Plus=+back
+Axis2Minus=+forward
+Joy2=+jump
+Joy7=togglemap
+POV1Up=invnext
+POV1Right=weapnext
+POV1Down=invuse
+POV1Left=weapprev
+Axis4Plus=+right
+Axis4Minus=+left
+Axis5Plus=+lookdown
+Axis5Minus=+lookup
+Axis6Plus=+attack
[Chex.DoubleBindings]
@@ -2447,9 +2458,10 @@ classicflight=false
color=40 cf 00
colorset=0
fov=90
+fviewbob=true
gender=other
movebob=0.25
-name=PortaDOOM
+name=RetroDECK
neverswitchonpickup=false
playerclass=Fighter
skin=base
@@ -2746,8 +2758,6 @@ Tab=togglemap
W=+forward
E=+use
T=messagemode
-LeftBracket=invprev
-RightBracket=invnext
Enter=invuse
A=+moveleft
S=+back
@@ -2755,9 +2765,8 @@ D=+moveright
`=toggleconsole
Shift=+speed
\=+showscores
-X=crouch
-Space=+jump
CapsLock=toggle cl_run
+Space=+jump
F1=menu_help
F2=menu_save
F3=menu_load
@@ -2768,8 +2777,9 @@ F7=menu_endgame
F8=togglemessages
F9=quickload
F10=menu_quit
+Scroll=+showscores
F11=bumpgamma
-F12=screenshot
+F12=spynext
SysRq=screenshot
Pause=pause
Home=land
@@ -2782,36 +2792,39 @@ Mouse1=+attack
Mouse2=+altattack
MWheelUp=weapprev
MWheelDown=weapnext
-MWheelRight=invnext
-MWheelLeft=invprev
-DPadUp=togglemap
-DPadDown=invuse
-DPadLeft=invprev
-DPadRight=invnext
-Pad_Start=pause
-Pad_Back=menu_main
-C=+crouch
-LShoulder=weapprev
-RShoulder=weapnext
-LTrigger=+altattack
-RTrigger=+attack
-Pad_A=+use
-Pad_Y=+jump
-Q=+zoom
-R=+reload
+W=+forward
+E=+use
+A=+moveleft
+S=+back
+D=+moveright
C=+crouch
UpArrow=+forward
LeftArrow=+moveleft
RightArrow=+moveright
DownArrow=+back
Joy1=+use
-Joy3=+reload
-Joy4=+jump
-Joy5=weapprev
-Joy6=weapnext
+Joy3=+crouch
+Joy4=+reload
+Joy5=+zoom
+Joy6=+altattack
Joy8=menu_main
Joy10=toggle cl_run
-Joy11=crouch
+Joy11=turn180
+Axis1Plus=+moveright
+Axis1Minus=+moveleft
+Axis2Plus=+back
+Axis2Minus=+forward
+Joy2=+jump
+Joy7=togglemap
+POV1Up=invnext
+POV1Right=weapnext
+POV1Down=invuse
+POV1Left=weapprev
+Axis4Plus=+right
+Axis4Minus=+left
+Axis5Plus=+lookdown
+Axis5Minus=+lookup
+Axis6Plus=+attack
[Harmony.DoubleBindings]
@@ -2842,9 +2855,10 @@ classicflight=false
color=40 cf 00
colorset=0
fov=90
+fviewbob=true
gender=other
movebob=0.25
-name=PortaDOOM
+name=RetroDECK
neverswitchonpickup=false
playerclass=Fighter
skin=base
@@ -3141,8 +3155,6 @@ Tab=togglemap
W=+forward
E=+use
T=messagemode
-LeftBracket=invprev
-RightBracket=invnext
Enter=invuse
A=+moveleft
S=+back
@@ -3150,9 +3162,8 @@ D=+moveright
`=toggleconsole
Shift=+speed
\=+showscores
-X=crouch
-Space=+jump
CapsLock=toggle cl_run
+Space=+jump
F1=menu_help
F2=menu_save
F3=menu_load
@@ -3163,8 +3174,9 @@ F7=menu_endgame
F8=togglemessages
F9=quickload
F10=menu_quit
+Scroll=+showscores
F11=bumpgamma
-F12=screenshot
+F12=spynext
SysRq=screenshot
Pause=pause
Home=land
@@ -3177,36 +3189,39 @@ Mouse1=+attack
Mouse2=+altattack
MWheelUp=weapprev
MWheelDown=weapnext
-MWheelRight=invnext
-MWheelLeft=invprev
-DPadUp=togglemap
-DPadDown=invuse
-DPadLeft=invprev
-DPadRight=invnext
-Pad_Start=pause
-Pad_Back=menu_main
-C=+crouch
-LShoulder=weapprev
-RShoulder=weapnext
-LTrigger=+altattack
-RTrigger=+attack
-Pad_A=+use
-Pad_Y=+jump
-Q=+zoom
-R=+reload
+W=+forward
+E=+use
+A=+moveleft
+S=+back
+D=+moveright
C=+crouch
UpArrow=+forward
LeftArrow=+moveleft
RightArrow=+moveright
DownArrow=+back
Joy1=+use
-Joy3=+reload
-Joy4=+jump
-Joy5=weapprev
-Joy6=weapnext
+Joy3=+crouch
+Joy4=+reload
+Joy5=+zoom
+Joy6=+altattack
Joy8=menu_main
Joy10=toggle cl_run
-Joy11=crouch
+Joy11=turn180
+Axis1Plus=+moveright
+Axis1Minus=+moveleft
+Axis2Plus=+back
+Axis2Minus=+forward
+Joy2=+jump
+Joy7=togglemap
+POV1Up=invnext
+POV1Right=weapnext
+POV1Down=invuse
+POV1Left=weapprev
+Axis4Plus=+right
+Axis4Minus=+left
+Axis5Plus=+lookdown
+Axis5Minus=+lookup
+Axis6Plus=+attack
[WoolBall.DoubleBindings]
@@ -3237,9 +3252,10 @@ classicflight=false
color=40 cf 00
colorset=0
fov=90
+fviewbob=true
gender=other
movebob=0.25
-name=PortaDOOM
+name=RetroDECK
neverswitchonpickup=false
playerclass=Fighter
skin=base
@@ -3545,8 +3561,6 @@ Tab=togglemap
W=+forward
E=+use
T=messagemode
-LeftBracket=invprev
-RightBracket=invnext
Enter=invuse
A=+moveleft
S=+back
@@ -3554,9 +3568,8 @@ D=+moveright
`=toggleconsole
Shift=+speed
\=+showscores
-X=crouch
-Space=+jump
CapsLock=toggle cl_run
+Space=+jump
F1=menu_help
F2=menu_save
F3=menu_load
@@ -3567,8 +3580,9 @@ F7=menu_endgame
F8=togglemessages
F9=quickload
F10=menu_quit
+Scroll=+showscores
F11=bumpgamma
-F12=screenshot
+F12=spynext
SysRq=screenshot
Pause=pause
Home=land
@@ -3581,36 +3595,39 @@ Mouse1=+attack
Mouse2=+altattack
MWheelUp=weapprev
MWheelDown=weapnext
-MWheelRight=invnext
-MWheelLeft=invprev
-DPadUp=togglemap
-DPadDown=invuse
-DPadLeft=invprev
-DPadRight=invnext
-Pad_Start=pause
-Pad_Back=menu_main
-C=+crouch
-LShoulder=weapprev
-RShoulder=weapnext
-LTrigger=+altattack
-RTrigger=+attack
-Pad_A=+use
-Pad_Y=+jump
-Q=+zoom
-R=+reload
+W=+forward
+E=+use
+A=+moveleft
+S=+back
+D=+moveright
C=+crouch
UpArrow=+forward
LeftArrow=+moveleft
RightArrow=+moveright
DownArrow=+back
Joy1=+use
-Joy3=+reload
-Joy4=+jump
-Joy5=weapprev
-Joy6=weapnext
+Joy3=+crouch
+Joy4=+reload
+Joy5=+zoom
+Joy6=+altattack
Joy8=menu_main
Joy10=toggle cl_run
-Joy11=crouch
+Joy11=turn180
+Axis1Plus=+moveright
+Axis1Minus=+moveleft
+Axis2Plus=+back
+Axis2Minus=+forward
+Joy2=+jump
+Joy7=togglemap
+POV1Up=invnext
+POV1Right=weapnext
+POV1Down=invuse
+POV1Left=weapprev
+Axis4Plus=+right
+Axis4Minus=+left
+Axis5Plus=+lookdown
+Axis5Minus=+lookup
+Axis6Plus=+attack
[Square.DoubleBindings]
@@ -3632,6 +3649,47 @@ DownArrow=+am_pandown
MWheelUp=am_zoom 1.2
MWheelDown=am_zoom -1.2
+[Doom.FPPBind.Bindings]
+
+[Doom.FPPBind.DoubleBindings]
+
+[Doom.BrutalDoomActions.Bindings]
+Joy5=+zoom
+Joy4=+reload
+Axis3Plus=grenadetoss
+
+[Doom.BrutalDoomActions.DoubleBindings]
+
+[Doom.BrutalDoomInteractions.Bindings]
+H=brutaltaunt
+V=wave1
+N=wave2
+J=advtaunt
+K=oneliner
+X=dual
+O=selectammodrop
+
+[Doom.BrutalDoomInteractions.DoubleBindings]
+
+[Doom.BrutalDoomAdvMoves.Bindings]
+
+[Doom.BrutalDoomAdvMoves.DoubleBindings]
+
+[Doom.PBAdvMoves.Bindings]
+U=unreloader
+G=+User1
+Axis3Plus=+user1
+Joy5=+user2
+Alt=+User3
+Joy11=+user3
+L=netevent EV_ClearGore
+
+[Doom.PBAdvMoves.DoubleBindings]
+
+[Doom.modactions.Bindings]
+
+[Doom.modactions.DoubleBindings]
+
[Doom.Player.Mod]
CHUD_DI_OffsetYActive=0
CHUD_DI_OffsetYMain=0
@@ -3814,20 +3872,20 @@ DIKILL_Archvile=0
DIKILL_Baron=0
DIKILL_Caco=0
DIKILL_Cyber=0
-DIKILL_Demon=2
+DIKILL_Demon=0
DIKILL_Hell=0
-DIKILL_Imp=5
+DIKILL_Imp=0
DIKILL_Knight=0
DIKILL_Lost=0
DIKILL_Mancubus=0
DIKILL_Pain=0
DIKILL_Revenant=0
DIKILL_Spider=0
-DIKILL_Total=7
+DIKILL_Total=0
DIKILL_Zombie=0
DIKILL_ZombieC=0
DIKILL_ZombieS=0
-DIKill_Gibbed=2
+DIKill_Gibbed=0
DIKill_Nightmare=0
DIMapTimer=0
DIMeleeCombo=0
@@ -3847,7 +3905,7 @@ DIUpgradesSet=
DIUpgradesString=
DIUpgradesSymbol=
DIValidLoad=0
-DIValidStamp=36964
+DIValidStamp=0
DI_ActiveManualPickup=false
DI_AddUpgradePerRow=0
DI_AdvMonsterAnim=true
@@ -3910,7 +3968,7 @@ DI_DDMap=-1
DI_DDPassiveID=none
DI_DDPassiveSET=none
DI_DDS=0
-DI_DDW=-6
+DI_DDW=0
DI_DDWeaponID=none
DI_DDX=0
DI_DDY=0
@@ -3930,14 +3988,14 @@ DI_EndRunCount=0
DI_FixLinuxCrash=false
DI_GameMode=0
DI_GameState=0
-DI_HActUsed=2
-DI_HAttempts=6
-DI_HDeaths=2
-DI_HKills=5
+DI_HActUsed=0
+DI_HAttempts=0
+DI_HDeaths=0
+DI_HKills=0
DI_HLoops=0
DI_HMaps=0
DI_HShopped=0
-DI_HSouls=16
+DI_HSouls=0
DI_HTimeH=0
DI_HTimeM=0
DI_HTimeS=0
@@ -4018,6 +4076,69 @@ DI_WeaponsOverheatFX=true
DI_karma=0
DI_skill=1
DImusMan_cmd=0
+PB_HatExtravaganza=0
+PB_alttracer=0
+PB_tracerlight=0
+PlayerCatchup=false
+SingleDualFire=0
+bd_AimMode=0
+bd_Cross=0
+bd_CrossASG=0
+bd_CrossBFG10K=0
+bd_CrossBFG9K=0
+bd_CrossFlame=0
+bd_CrossGL=0
+bd_CrossMinigun=0
+bd_CrossPistol=0
+bd_CrossPlasma=0
+bd_CrossRL=0
+bd_CrossRailgun=0
+bd_CrossRev=0
+bd_CrossRifle=0
+bd_CrossSMG=0
+bd_CrossSSG=0
+bd_CrossShotgun=0
+bd_CrossUnmaker=0
+bd_SimpleSlide=0
+bd_autoreload=true
+bd_bloodamount=2
+bd_centeredhud=false
+bd_disablebloodyscreen=0
+bd_enablesprint=0
+bd_flashlight=0
+bd_lowgraphicsmode=0
+bd_morebloodmist=0
+bd_sbartype=1
+cheello_rotatingEvilEye=1
+cheello_smoothdemons=0
+cheello_smoothdemonsbite=1
+cheello_spinningpickups=1
+cheello_voxelIconAlign=false
+cheello_voxelIconOfSin=true
+cheello_voxelIconOffset=0
+cheello_voxelweaponsClose=0
+cheello_voxelweaponsOn=1
+cheello_voxelweaponsPhase=1
+cheello_voxelweaponsSide=0
+cl_MoveTilt=true
+cl_flashlight_plus_color=7f 7f 7f
+cl_flashlight_plus_color_2_mult=1
+cl_flashlight_plus_inner=25
+cl_flashlight_plus_inner_2=8
+cl_flashlight_plus_intensity=256
+cl_flashlight_plus_intensity_2=512
+cl_flashlight_plus_location=0
+cl_flashlight_plus_outer=50
+cl_flashlight_plus_outer_2=16
+cl_flashlight_plus_plus_alertmonsters=true
+cl_flashlight_plus_plus_custpos_x=0
+cl_flashlight_plus_plus_custpos_y=0
+cl_flashlight_plus_plus_custpos_z=0
+cl_flashlight_plus_plus_playsound=true
+cl_flashlight_plus_plus_sound=0
+cl_flashlight_plus_second_beam=true
+cl_step_delaymul=1
+cl_step_volmul=7
debug_activateRoom=0
debug_add_souls=0
debug_boss=0
@@ -4055,8 +4176,393 @@ debug_spawner_monsters=true
debug_spawner_obstacles=true
debug_weather=-1
debug_zKill=true
+disable_screentilt=0
+led_BFGFirFlsh=0.65
+led_PLRifFlsh=0.1
+led_RifleADS=1
+led_ShotADS=1
+led_TogArmBns=0.15
+led_TogBckPck=0.3
+led_TogBluArm=0.2
+led_TogBluKey=0.4
+led_TogBluSkl=0.4
+led_TogBrskBrght=0.25
+led_TogCmpMp=0.4
+led_TogGrnArm=0.2
+led_TogHlthBns=0.15
+led_TogInvln=0.5
+led_TogLghtAmp=0.4
+led_TogMgSph=0.4
+led_TogPartVis=0.4
+led_TogRadSuit=0.4
+led_TogRedKey=0.4
+led_TogRedSkl=0.4
+led_TogSolSph=0.4
+led_TogYlwKey=0.4
+led_TogYlwSkl=0.4
+mblur=false
+mblur_autostop=true
+mblur_blendmode=1
+mblur_recovery=64
+mblur_recovery2=90
+mblur_samples=5
+mblur_strength=64
+mblur_threshold=30
+pb_RLOverloadCell=0
+pb_SGAltAmmoSwap=0
+pb_SGPumpFromHip=0
+pb_UpgradeCarbine=0
+pb_UpgradeGL=0
+pb_UpgradeNailgun=0
+pb_UpgradePlasma=0
+pb_UpgradeRevolver=0
+pb_UpgradeShotgun=0
+pb_bloodamount=2
+pb_curmaxammolist=true
+pb_dasheffect=true
+pb_doubletap=false
+pb_exaggeratedrecoil=true
+pb_exaggeratedrecoilmul=0.5
+pb_execution_box=1
+pb_floorwallblooddrawdist=800
+pb_hideunusedtypes=true
+pb_hudalpha=1
+pb_hudboxalpha=1
+pb_huddynamics=true
+pb_hudxmargin=0
+pb_hudymargin=0
+pb_lowflashesmode=false
+pb_lowgraphicsmode=0
+pb_maxtaptime=10
+pb_messagesize=1
+pb_showammolist=true
+pb_showhudvisor=false
+pb_showhudvisorglass=false
+pb_showlevelstats=false
+pb_toggle_aim_hold=false
+pb_uselowreshudfont=false
+pb_weapon_crosshairs=false
+py_weaponwheel_freeze=true
+py_weaponwheel_invert=0
+py_weaponwheel_musicfade=false
+qtilt_strength=1
+sd_lasers_densityoffset=1
+ws_d1pois_texswap=true
+ws_d2sky_compat=true
+ws_finaldoom_texswap=true
+zm_doubletap=true
+zm_fullbobspeed=8
+zm_maxtaptime=10
+zm_offsetdirection=false
+zm_offsetmaxrange=30
+zm_offsetspeed=75
+zm_pitchswaytype=0
+zm_stillbob=false
+zm_yawsway=true
+zm_yawswaydirection=false
+zm_yawswayfriction=10
+zm_yawswayrange=2
+zm_yawswayspeed=2
[Doom.LocalServerInfo.Mod]
+BD_AmmoPackCheck=3
+BD_DestructibleBodies=0
+BD_GIMMELESSAMMO=0
+BD_NOBOSSES=0
+BD_NODEMONBlur=0
+BD_NODEMONWEAPONS=0
+BD_NoHeadshots=0
+BD_NoMg42=0
+BD_ShotgunSpawner=1
+DisablePB_Autoshotgun=false
+DisablePB_AutoshotgunUpgrade=false
+DisablePB_Carbine=false
+DisablePB_CryoRifle=false
+DisablePB_Deagle=false
+DisablePB_LMG=false
+DisablePB_M2Plasma=false
+DisablePB_M2Upgrade=false
+DisablePB_MinigunUpgrade=false
+DisablePB_Nailgun=false
+DisablePB_QuadSG=false
+DisablePB_Railgun=false
+DisablePB_Revolver=false
+DisablePB_SGMagazine=false
+DisablePB_SMG=false
+DisablePB_SuperGL=false
+DisablePB_Unmaker=false
+DisablePulseCannonUpgrade=false
+DisableRifleUpgrade=false
+DynamicSpawnMonsters=1
+DynamicWeaponSpawn=true
+EAI_Debug=false
+EAI_Stealth=true
+EAI_StealthFactor=24
+NoDemonStrenght=0
+PB_NaziExclusiveSpawning=true
+SpawnBalance=671
+V5_Cull=false
+V5_MDist=900
+V5_MODELS=false
+V5_Q3Bob=0.5
+V5_Q3Spin=5
+V5_Q3Zoff=16
+V5_Quake3=false
+bd_AgileZombies=0
+bd_BloodTrail=0
+bd_LavaSplashes=0
+bd_NoPickupsAnimations=false
+bd_NoZombieRifleDrop=0
+bd_ScreenFX=0
+bd_V21AR=false
+bd_WadCheck=1
+bd_classicmonsters=0
+bd_disablebfgspawn=1
+bd_disablechaingunspawn=1
+bd_disablechainsawspawn=1
+bd_disablecrueltybonus=0
+bd_disabledecorations=0
+bd_disabledemonspheres=0
+bd_disablefriendlymarines=0
+bd_disablemapenhancements=0
+bd_disablenewenemies=1
+bd_disablenewguns=0
+bd_disableplasmaspawn=1
+bd_disablerocketlauncherspawn=1
+bd_disablescanner=0
+bd_disablessgspawn=1
+bd_disablewaterripples2=1
+bd_footstepsounds=1
+bd_infinitecasings=0
+bd_infinitesprint=false
+bd_mantling=0
+bd_norandompickupsprites=0
+bd_reloading=false
+bd_rocketbackblast=1
+bd_shootablerocketammo=0
+bd_voxeldec=1
+bdv22_Caco=0
+bloodsplash=0
+fs_delay_mul=1
+fs_volume_mul=1
+hs_factor=2
+hs_hitbox=true
+isrunningzandronum=1
+led_AimPunch=1
+led_ArmorBonus=0
+led_ArmorSpark=1
+led_BFGReload=1
+led_Barrels=1
+led_CasingSmoke=1
+led_DeathAnim=0
+led_MagLife=1000
+led_MedSys=1
+led_MinigunReload=1
+led_PistolReload=1
+led_PlasmaReload=1
+led_RLReload=1
+led_ReloadToggle=1
+led_RifleReload=1
+led_SSGAltFire=0
+led_SSGReload=1
+led_ShellCasings=1
+led_ShellLife=1000
+led_ShellSys=1
+led_ShotPump=0
+led_ShotgunReload=1
+led_SmokeEffects=1
+led_SpentMags=1
+levelsToPlay=32
+nashgore_bloodamount=255
+nashgore_bloodspurt=true
+nashgore_bloodtype=0
+nashgore_corpseblood=true
+nashgore_deathflip=true
+nashgore_footprints=true
+nashgore_gibamount=255
+nashgore_gibtype=0
+nashgore_icedeath=true
+nashgore_maxcasings=50
+nashgore_maxgore=1024
+nashgore_splat=true
+nashgore_spriteblood=false
+nashgore_squish=true
+nodoomguytalk=0
+nopaineffect=0
+noscreensplash=0
+pb_NoAfrit=0
+pb_NoAnnihilator=0
+pb_NoArachnophyte=0
+pb_NoArachnotron2=0
+pb_NoAutoshotgunSergeant=0
+pb_NoBeamRevenant=0
+pb_NoBelphegor=0
+pb_NoBlackholeWeapon=0
+pb_NoBloodDemon=0
+pb_NoBrownImps=0
+pb_NoCSSGWeapon=1
+pb_NoCarbineZombie=0
+pb_NoClassicCommando=0
+pb_NoCyberBaron=0
+pb_NoCyberKnight=0
+pb_NoCyberPaladin=0
+pb_NoDaedabus=0
+pb_NoDarkImps=0
+pb_NoDemolisher=0
+pb_NoDemonTechSoldier=0
+pb_NoDraugr=0
+pb_NoFleshwizard=0
+pb_NoHeavyGLWeapon=0
+pb_NoHellion=0
+pb_NoHelmetAnimation=0
+pb_NoHelmetSergeant=0
+pb_NoHelmetZman=0
+pb_NoIceVile=0
+pb_NoInfernoArachnotron=0
+pb_NoInfernus=0
+pb_NoJuggernaut=0
+pb_NoMagCaco=0
+pb_NoMechDemon=0
+pb_NoNailgunMajor=0
+pb_NoOverlord=0
+pb_NoPhantasm=0
+pb_NoPistolZman=0
+pb_NoPlasmaZombie=0
+pb_NoPulseCannonUpgrade=0
+pb_NoPyroSergeant=0
+pb_NoQuadSergeant=0
+pb_NoRiotShieldGuy=0
+pb_NoRocketSergeant=0
+pb_NoSavageImps=0
+pb_NoSufferElemental=0
+pb_NoUpgrades=0
+pb_NoVolcabus=0
+pb_NoZSpecOps=0
+pb_NoZombieScientist=0
+pb_SSGRandomSpawn=false
+pb_ScaleXWeapons=false
+pb_VoidSpectre=0
+pb_adashboost=10
+pb_adashfriction=1
+pb_airdash=false
+pb_autojump=true
+pb_classicmonsters=0
+pb_crouchslide=true
+pb_crouchspeed=0.5
+pb_cslideduration=10
+pb_cslidestrength=1.5
+pb_cslidetype=0
+pb_cyberdemondeath=false
+pb_dash=true
+pb_dashboost=15
+pb_dashheight=0.6
+pb_disable_sergeant_prone=false
+pb_disabledecorations=1
+pb_disabledynamicavoid=false
+pb_disablemapenhancements=1
+pb_disablenewenemies=0
+pb_disablenewguns=0
+pb_doublejump=2
+pb_doublejumpheight=1
+pb_dropprevention=false
+pb_experimental=false
+pb_fastcryowarmup=0
+pb_friction=1.6
+pb_grenadeimpact=0
+pb_hazardmovement=true
+pb_jumpheight=8
+pb_knuckleanimationinstart=0
+pb_landing=true
+pb_landingsens=6
+pb_landingspeed=0.25
+pb_ledgegrab=true
+pb_maxgroundspeed=15.1
+pb_maxhopspeed=28
+pb_minlanding=0.5
+pb_movetype=0
+pb_multipledashes=0
+pb_nobulletpenetration=1
+pb_nocooldown=false
+pb_performance_fire=false
+pb_qslideaccel=6
+pb_qslideduration=8
+pb_setgravity=1
+pb_sglgrenadeimpact=0
+pb_spawner_autoshotgun=0
+pb_spawner_drum=0
+pb_spawner_shotgunupgrade=0
+pb_spawner_tiered=false
+pb_strafemodifier=1.33
+pb_walkspeed=0.5
+pb_weapon_recoil_extra_weapons=false
+pb_weapon_recoil_mod_horizontal=1
+pb_weapon_recoil_mod_vertical=1
+pb_wjdoublejumprenew=false
+pb_wjump=false
+pb_wjumpboost=1.5
+pb_wjumpheight=0.75
+pb_wslide=false
+pb_wslidevelz=0.9
+pk_bhopjumpheight=0.85
+sv_deathtilt=true
+sv_movetilt=false
+sv_movetiltangle=0.015
+sv_movetiltscalar=0.2
+sv_movetiltspeed=15
+sv_strafetilt=true
+sv_strafetiltangle=0.5
+sv_strafetiltinvert=false
+sv_strafetiltspeed=1
+sv_turntilt=true
+sv_turntiltinvert=false
+sv_turntiltscalar=1.5
+sv_underwatertilt=true
+sv_underwatertiltangle=0.05
+sv_underwatertiltscalar=1
+sv_underwatertiltspeed=0.5
+zdoombrutalblood=2
+zdoombrutaljanitor=0
+zdoombrutaljanitorcasings=0
+zm_adashboost=10
+zm_adashfriction=1
+zm_airdash=false
+zm_autojump=true
+zm_crouchslide=false
+zm_crouchspeed=0.7
+zm_cslideduration=13
+zm_cslidestrength=1.5
+zm_cslidetype=0
+zm_dash=false
+zm_dashboost=1.5
+zm_dashheight=0.75
+zm_doublejump=0
+zm_doublejumpheight=1.2
+zm_dropprevention=false
+zm_friction=8
+zm_jumpheight=5.5
+zm_landing=false
+zm_landingsens=6
+zm_landingspeed=0.25
+zm_ledgegrab=false
+zm_maxgroundspeed=12
+zm_maxhopspeed=28
+zm_minlanding=0.5
+zm_movetype=0
+zm_multipledashes=0
+zm_qslideaccel=6
+zm_qslideduration=8
+zm_rampjump=false
+zm_rjumpmulti=1
+zm_setgravity=0.56
+zm_speedometer=0
+zm_strafemodifier=1
+zm_walkspeed=0.7
+zm_wjdoublejumprenew=false
+zm_wjump=false
+zm_wjumpboost=1.5
+zm_wjumpheight=0.75
+zm_wslide=false
+zm_wslidevelz=0.9
[Doom.ConfigOnlyVariables.Mod]
DICache_ACV1=
@@ -4065,13 +4571,60 @@ DICache_SGLines1=
DICache_SGLines2=
DICache_SGLines3=
DICache_TK=0
+pb_newmugshot=true
[Joy:JS:0]
-Sensitivity=1.1
+Sensitivity=0.2
Axis0deadzone=0.0999998
+Axis0scale=0.7
Axis1deadzone=0.0999998
+Axis1scale=0.7
Axis2map=-1
Axis3deadzone=0.450001
+Axis3scale=0.7
Axis4deadzone=0.25
+Axis4scale=0.7
Axis4map=1
-Axis5deadzone=0.100001
\ No newline at end of file
+Axis5deadzone=0.100001
+
+[Joy:JS:1]
+Sensitivity=0.2
+Axis0deadzone=0.0999998
+Axis0scale=0.7
+Axis1deadzone=0.0999998
+Axis1scale=0.7
+Axis2map=-1
+Axis3deadzone=0.450001
+Axis3scale=0.7
+Axis4deadzone=0.25
+Axis4scale=0.7
+Axis4map=1
+Axis5deadzone=0.100001
+
+[Joy:JS:2]
+Sensitivity=0.2
+Axis0deadzone=0.0999998
+Axis0scale=0.7
+Axis1deadzone=0.0999998
+Axis1scale=0.7
+Axis2map=-1
+Axis3deadzone=0.450001
+Axis3scale=0.7
+Axis4deadzone=0.25
+Axis4scale=0.7
+Axis4map=1
+Axis5deadzone=0.100001
+
+[Joy:JS:3]
+Sensitivity=0.2
+Axis0deadzone=0.0999998
+Axis0scale=0.7
+Axis1deadzone=0.0999998
+Axis1scale=0.7
+Axis2map=-1
+Axis3deadzone=0.450001
+Axis3scale=0.7
+Axis4deadzone=0.25
+Axis4scale=0.7
+Axis4map=1
+Axis5deadzone=0.100001
diff --git a/emu-configs/gzdoom/gzdoom.pk3 b/emu-configs/gzdoom/gzdoom.pk3
deleted file mode 100644
index c96467ab..00000000
Binary files a/emu-configs/gzdoom/gzdoom.pk3 and /dev/null differ
diff --git a/emu-configs/gzdoom/gzdoom.sh b/emu-configs/gzdoom/gzdoom.sh
index dda22916..620b809f 100644
--- a/emu-configs/gzdoom/gzdoom.sh
+++ b/emu-configs/gzdoom/gzdoom.sh
@@ -1,5 +1,7 @@
#!/bin/bash
+source /app/libexec/logger.sh
+
# Define the IWAD files list
IWAD_FILES=("DOOM1.WAD" "DOOM.WAD" "DOOM2.WAD" "DOOM2F.WAD" "DOOM64.WAD" "TNT.WAD"
"PLUTONIA.WAD" "HERETIC1.WAD" "HERETIC.WAD" "HEXEN.WAD" "HEXDD.WAD"
@@ -8,16 +10,6 @@ IWAD_FILES=("DOOM1.WAD" "DOOM.WAD" "DOOM2.WAD" "DOOM2F.WAD" "DOOM64.WAD" "TNT.WA
"doom_complete.pk3"
)
-# Function to log messages to terminal and a log file
-log() {
- local message="$1"
- local logfile="$rdhome/logs/gzdoom.log"
- local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S])"
-
- echo "$timestamp $message" | tee -a "$logfile"
-}
-
-
# Function to check if a file is an IWAD
is_iwad() {
local file="$1"
@@ -62,8 +54,8 @@ if [[ "${1##*.}" != "doom" ]]; then
fi
# Log the command
- log "[INFO] Loading: \"$1\""
- log "[INFO] Executing command \"$command\""
+ log i "Loading: \"$1\""
+ log i "Executing command \"$command\""
# Execute the command
eval "$command"
@@ -71,11 +63,11 @@ if [[ "${1##*.}" != "doom" ]]; then
# Check if $1 is a .doom file
else
doom_file="$1"
- log "[INFO] Found a doom file: \"$1\""
+ log i "Found a doom file: \"$1\""
# Check if the .doom file exists
if [[ ! -e "$doom_file" ]]; then
- log "[Error] doom file not found in \"$doom_file\""
+ log e "doom file not found in \"$doom_file\""
zenity --error --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \
@@ -103,15 +95,15 @@ else
# Check if the file is an IWAD
if [[ $(is_iwad "$found_file") == "true" ]]; then
command+=" -iwad $found_file"
- log "[INFO] Appending the param \"-iwad $found_file\""
+ log i "Appending the param \"-iwad $found_file\""
else
command+=" -file $found_file"
- log "[INFO] Appending the param \"-file $found_file\""
+ log i "Appending the param \"-file $found_file\""
fi
done < "$doom_file"
# Log the command
- log "[INFO] Executing command \"$command\""
+ log i "Executing command \"$command\""
# Execute the command
eval "$command"
diff --git a/emu-configs/mame/cfg/default.cfg b/emu-configs/mame/cfg/default.cfg
deleted file mode 100644
index 7fbdab04..00000000
--- a/emu-configs/mame/cfg/default.cfg
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
- JOYCODE_1_HAT1UP
-
-
-
-
- JOYCODE_1_SELECT
-
-
-
-
- KEYCODE_LCONTROL KEYCODE_M
-
-
-
-
- KEYCODE_LCONTROL KEYCODE_P
-
-
-
-
- KEYCODE_LCONTROL KEYCODE_MINUSPAD
-
-
-
-
- KEYCODE_LCONTROL KEYCODE_S
-
-
-
-
- KEYCODE_LCONTROL KEYCODE_A
-
-
-
-
- KEYCODE_LCONTROL KEYCODE_PLUSPAD
-
-
-
-
- KEYCODE_LCONTROL KEYCODE_X
-
-
-
-
-
diff --git a/emu-configs/mame/cheat0264.zip b/emu-configs/mame/cheat0264.zip
new file mode 100644
index 00000000..6f3f1a5d
Binary files /dev/null and b/emu-configs/mame/cheat0264.zip differ
diff --git a/emu-configs/mame/default.cfg b/emu-configs/mame/default.cfg
new file mode 100644
index 00000000..8b2ca5a8
--- /dev/null
+++ b/emu-configs/mame/default.cfg
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+ JOYCODE_1_BUTTON8 OR KEYCODE_1
+
+
+
+
+ KEYCODE_5 OR JOYCODE_1_BUTTON7
+
+
+
+
+ JOYCODE_2_BUTTON8 OR KEYCODE_2
+
+
+
+
+ KEYCODE_6 OR JOYCODE_2_BUTTON7
+
+
+
+
+ JOYCODE_3_BUTTON8 OR KEYCODE_3
+
+
+
+
+ KEYCODE_7 OR JOYCODE_3_BUTTON7
+
+
+
+
+ JOYCODE_4_BUTTON8 OR KEYCODE_4
+
+
+
+
+ KEYCODE_8 OR JOYCODE_4_BUTTON7
+
+
+
+
+ JOYCODE_1_BUTTON8 OR KEYCODE_S KEYCODE_1
+
+
+
+
+ JOYCODE_2_BUTTON8 OR KEYCODE_S KEYCODE_2
+
+
+
+
+ JOYCODE_3_BUTTON8 OR KEYCODE_S KEYCODE_3
+
+
+
+
+ JOYCODE_4_BUTTON8 OR KEYCODE_S KEYCODE_4
+
+
+
+
+ JOYCODE_1_BUTTON7 OR KEYCODE_LSHIFT KEYCODE_1
+
+
+
+
+ JOYCODE_2_BUTTON7 OR KEYCODE_LSHIFT KEYCODE_2
+
+
+
+
+ JOYCODE_3_BUTTON7 OR KEYCODE_LSHIFT KEYCODE_3
+
+
+
+
+ JOYCODE_4_BUTTON7 OR KEYCODE_LSHIFT KEYCODE_4
+
+
+
+
+ KEYCODE_LALT KEYCODE_B KEYCODE_1
+
+
+
+
+ KEYCODE_LALT KEYCODE_S KEYCODE_1
+
+
+
+
+ KEYCODE_LALT KEYCODE_S KEYCODE_2
+
+
+
+
+ KEYCODE_LALT KEYCODE_S KEYCODE_3
+
+
+
+
+ KEYCODE_LALT KEYCODE_S KEYCODE_4
+
+
+
+
+ KEYCODE_LALT KEYCODE_T KEYCODE_1
+
+
+
+
+ KEYCODE_LALT KEYCODE_T KEYCODE_2
+
+
+
+
+ KEYCODE_LALT KEYCODE_T KEYCODE_3
+
+
+
+
+ KEYCODE_LALT KEYCODE_T KEYCODE_4
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_M
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_Q
+
+
+
+
+ JOYCODE_1_RYAXIS_NEG_SWITCH OR KEYCODE_PGUP
+
+
+
+
+ JOYCODE_1_RYAXIS_POS_SWITCH OR KEYCODE_PGDN
+
+
+
+
+ NONE
+
+
+
+
+ NONE
+
+
+
+
+ NONE
+
+
+
+
+ NONE
+
+
+
+
+ NONE
+
+
+
+
+ NONE
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_MINUSPAD
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_S KEYCODE_1
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_S
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_A KEYCODE_1
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_A
+
+
+
+
+ NONE
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_R
+
+
+
+
+ NONE
+
+
+
+
+ NONE
+
+
+
+
+ NONE
+
+
+
+
+ NONE
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_PLUSPAD
+
+
+
+
+ NONE
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_X
+
+
+
+
+ NONE
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_V
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_C
+
+
+
+
+ JOYCODE_1_RXAXIS_POS_SWITCH
+
+
+
+
+ JOYCODE_1_RXAXIS_NEG_SWITCH OR KEYCODE_TAB
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_ENTER
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_Y
+
+
+
+
+ KEYCODE_LCONTROL KEYCODE_U
+
+
+
+
+
diff --git a/emu-configs/mame/mame.ini b/emu-configs/mame/mame.ini
index f47c2062..2fccb9a6 100644
--- a/emu-configs/mame/mame.ini
+++ b/emu-configs/mame/mame.ini
@@ -8,7 +8,7 @@ writeconfig 0
# CORE SEARCH PATH OPTIONS
#
homepath /var/data/mame/plugin-data
-rompath RETRODECKROMSDIR/mame/;RETRODECKROMSDIR/arcade/;RETRODECKROMSDIR/bbcmicro/
+rompath RETRODECKROMSDIR/adam;RETRODECKROMSDIR/amstradcpc;RETRODECKROMSDIR/apple2;RETRODECKROMSDIR/apple2gs;RETRODECKROMSDIR/arcade;RETRODECKROMSDIR/arcadia;RETRODECKROMSDIR/archimedes;RETRODECKROMSDIR/astrocde;RETRODECKROMSDIR/atari7800;RETRODECKROMSDIR/atarijaguar;RETRODECKROMSDIR/bbcmicro;RETRODECKROMSDIR/cdimono1;RETRODECKROMSDIR/channelf;RETRODECKROMSDIR/consolearcade;RETRODECKROMSDIR/cps;RETRODECKROMSDIR/cps1;RETRODECKROMSDIR/cps2;RETRODECKROMSDIR/cps3;RETRODECKROMSDIR/crvision;RETRODECKROMSDIR/daphne;RETRODECKROMSDIR/electron;RETRODECKROMSDIR/fm7;RETRODECKROMSDIR/fmtowns;RETRODECKROMSDIR/gamate;RETRODECKROMSDIR/gameandwatch;RETRODECKROMSDIR/gamecom;RETRODECKROMSDIR/gmaster;RETRODECKROMSDIR/gx4000;RETRODECKROMSDIR/intellivision;RETRODECKROMSDIR/laserdisc;RETRODECKROMSDIR/lcdgames;RETRODECKROMSDIR/mame;RETRODECKROMSDIR/megaduck;RETRODECKROMSDIR/model2;RETRODECKROMSDIR/neogeo;RETRODECKROMSDIR/neogeocd;RETRODECKROMSDIR/neogeocdjp;RETRODECKROMSDIR/odyssey2;RETRODECKROMSDIR/pv1000;RETRODECKROMSDIR/scv;RETRODECKROMSDIR/stv;RETRODECKROMSDIR/supervision;RETRODECKROMSDIR/supracan;RETRODECKROMSDIR/ti99;RETRODECKROMSDIR/vectrex;RETRODECKROMSDIR/videopac;RETRODECKROMSDIR/vsmile;RETRODECKROMSDIR/x68000
hashpath /var/data/mame/hash
samplepath /var/data/mame/assets/samples
artpath /var/data/mame/assets/artwork
@@ -127,14 +127,14 @@ speaker_report 0
#
coin_lockout 1
ctrlr
-mouse 0
+mouse 1
joystick 1
-lightgun 0
+lightgun 1
multikeyboard 0
-multimouse 0
+multimouse 1
steadykey 0
ui_active 0
-offscreen_reload 0
+offscreen_reload 1
joystick_map auto
joystick_deadzone 0.15
joystick_saturation 0.85
diff --git a/emu-configs/primehack/Dolphin.ini b/emu-configs/primehack/config/Dolphin.ini
similarity index 100%
rename from emu-configs/primehack/Dolphin.ini
rename to emu-configs/primehack/config/Dolphin.ini
diff --git a/emu-configs/primehack/FreeLookController.ini b/emu-configs/primehack/config/FreeLookController.ini
similarity index 100%
rename from emu-configs/primehack/FreeLookController.ini
rename to emu-configs/primehack/config/FreeLookController.ini
diff --git a/emu-configs/primehack/GBA.ini b/emu-configs/primehack/config/GBA.ini
similarity index 100%
rename from emu-configs/primehack/GBA.ini
rename to emu-configs/primehack/config/GBA.ini
diff --git a/emu-configs/primehack/GCKeyNew.ini b/emu-configs/primehack/config/GCKeyNew.ini
similarity index 100%
rename from emu-configs/primehack/GCKeyNew.ini
rename to emu-configs/primehack/config/GCKeyNew.ini
diff --git a/emu-configs/primehack/GCPadNew.ini b/emu-configs/primehack/config/GCPadNew.ini
similarity index 100%
rename from emu-configs/primehack/GCPadNew.ini
rename to emu-configs/primehack/config/GCPadNew.ini
diff --git a/emu-configs/primehack/GFX.ini b/emu-configs/primehack/config/GFX.ini
similarity index 100%
rename from emu-configs/primehack/GFX.ini
rename to emu-configs/primehack/config/GFX.ini
diff --git a/emu-configs/primehack/Hotkeys.ini b/emu-configs/primehack/config/Hotkeys.ini
similarity index 100%
rename from emu-configs/primehack/Hotkeys.ini
rename to emu-configs/primehack/config/Hotkeys.ini
diff --git a/emu-configs/primehack/config/Logger.ini b/emu-configs/primehack/config/Logger.ini
new file mode 100644
index 00000000..9021eeae
--- /dev/null
+++ b/emu-configs/primehack/config/Logger.ini
@@ -0,0 +1,58 @@
+[Logs]
+ActionReplay = False
+AI = False
+Audio = False
+BOOT = False
+CI = False
+COMMON = False
+CONSOLE = False
+CORE = False
+CP = False
+DIO = False
+DSP = False
+DSPHLE = False
+DSPLLE = False
+DSPMails = False
+DVD = False
+EXI = False
+FileMon = False
+FRAMEDUMP = False
+GDB_STUB = False
+GP = False
+HLE = False
+Host GPU = False
+HSP = False
+IOS = False
+IOS_DI = False
+IOS_ES = False
+IOS_FS = False
+IOS_NET = False
+IOS_SD = False
+IOS_SSL = False
+IOS_STM = False
+IOS_USB = False
+IOS_WC24 = False
+IOS_WFS = False
+IOS_WIIMOTE = False
+JIT = False
+MASTER = False
+MemCard Manager = False
+MI = False
+NETPLAY = False
+OSREPORT = False
+OSREPORT_HLE = False
+PE = False
+PI = False
+PowerPC = False
+SI = False
+SP1 = False
+SYMBOLS = False
+VI = False
+Video = False
+WII_IPC = False
+Wiimote = False
+[Options]
+Verbosity = 1
+WriteToConsole = True
+WriteToFile = False
+WriteToWindow = True
diff --git a/emu-configs/primehack/Profiles/GCPad/PrimeHack SD-GC Nintendo Layout.ini b/emu-configs/primehack/config/Profiles/GCPad/PrimeHack SD-GC Nintendo Layout.ini
similarity index 100%
rename from emu-configs/primehack/Profiles/GCPad/PrimeHack SD-GC Nintendo Layout.ini
rename to emu-configs/primehack/config/Profiles/GCPad/PrimeHack SD-GC Nintendo Layout.ini
diff --git a/emu-configs/primehack/Profiles/GCPad/PrimeHack SD-GC Xbox Layout.ini b/emu-configs/primehack/config/Profiles/GCPad/PrimeHack SD-GC Xbox Layout.ini
similarity index 100%
rename from emu-configs/primehack/Profiles/GCPad/PrimeHack SD-GC Xbox Layout.ini
rename to emu-configs/primehack/config/Profiles/GCPad/PrimeHack SD-GC Xbox Layout.ini
diff --git a/emu-configs/primehack/Profiles/Hotkeys/RetroDECK Defaults.ini b/emu-configs/primehack/config/Profiles/Hotkeys/RetroDECK Defaults.ini
similarity index 100%
rename from emu-configs/primehack/Profiles/Hotkeys/RetroDECK Defaults.ini
rename to emu-configs/primehack/config/Profiles/Hotkeys/RetroDECK Defaults.ini
diff --git a/emu-configs/primehack/Profiles/Wiimote/PrimeHack SD-Wii Nintendo Layout.ini b/emu-configs/primehack/config/Profiles/Wiimote/PrimeHack SD-Wii Nintendo Layout.ini
similarity index 100%
rename from emu-configs/primehack/Profiles/Wiimote/PrimeHack SD-Wii Nintendo Layout.ini
rename to emu-configs/primehack/config/Profiles/Wiimote/PrimeHack SD-Wii Nintendo Layout.ini
diff --git a/emu-configs/primehack/Profiles/Wiimote/PrimeHack SD-Wii Xbox Layout.ini b/emu-configs/primehack/config/Profiles/Wiimote/PrimeHack SD-Wii Xbox Layout.ini
similarity index 100%
rename from emu-configs/primehack/Profiles/Wiimote/PrimeHack SD-Wii Xbox Layout.ini
rename to emu-configs/primehack/config/Profiles/Wiimote/PrimeHack SD-Wii Xbox Layout.ini
diff --git a/emu-configs/primehack/Qt.ini b/emu-configs/primehack/config/Qt.ini
similarity index 100%
rename from emu-configs/primehack/Qt.ini
rename to emu-configs/primehack/config/Qt.ini
diff --git a/emu-configs/primehack/WiimoteNew.ini b/emu-configs/primehack/config/WiimoteNew.ini
similarity index 100%
rename from emu-configs/primehack/WiimoteNew.ini
rename to emu-configs/primehack/config/WiimoteNew.ini
diff --git a/emu-configs/primehack/data/GameSettings/R3ME01.ini b/emu-configs/primehack/data/GameSettings/R3ME01.ini
new file mode 100644
index 00000000..67fa7cf4
--- /dev/null
+++ b/emu-configs/primehack/data/GameSettings/R3ME01.ini
@@ -0,0 +1,2 @@
+[Core]
+SyncGPU = False
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_10ca6dca25531ce9_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_10ca6dca25531ce9_4.dds
new file mode 100755
index 00000000..b2429513
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_10ca6dca25531ce9_4.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_173f3a24d9dd4a66_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_173f3a24d9dd4a66_6.dds
new file mode 100755
index 00000000..dbfa4e45
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_173f3a24d9dd4a66_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_2a304e0fc49a883c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_2a304e0fc49a883c_5.dds
new file mode 100755
index 00000000..370a56d5
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_2a304e0fc49a883c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_43be3d9c0c2e2dbd_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_43be3d9c0c2e2dbd_6.dds
new file mode 100755
index 00000000..3fa8125d
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_43be3d9c0c2e2dbd_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_47002754133e4ff5_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_47002754133e4ff5_6.dds
new file mode 100755
index 00000000..01030e4e
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_47002754133e4ff5_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_4eb90bb511d2b10e_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_4eb90bb511d2b10e_4.dds
new file mode 100755
index 00000000..3e4bc408
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_4eb90bb511d2b10e_4.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_54e294522955b32e_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_54e294522955b32e_5.dds
new file mode 100755
index 00000000..10ba12a2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_54e294522955b32e_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_5945fd1a085a2aeb_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_5945fd1a085a2aeb_5.dds
new file mode 100755
index 00000000..3fa8125d
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_5945fd1a085a2aeb_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_70a90df632629730_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_70a90df632629730_4.dds
new file mode 100755
index 00000000..543933e8
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_70a90df632629730_4.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_7e31a38b70ecbddd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_7e31a38b70ecbddd_5.dds
new file mode 100755
index 00000000..61794a2e
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_7e31a38b70ecbddd_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_86475f276fb14e06_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_86475f276fb14e06_5.dds
new file mode 100755
index 00000000..69527151
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_86475f276fb14e06_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_889e80824c922249_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_889e80824c922249_6.dds
new file mode 100755
index 00000000..32a58e85
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_889e80824c922249_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_96342171475066ab_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_96342171475066ab_6.dds
new file mode 100755
index 00000000..fa710c85
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_96342171475066ab_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_9af2d52683113ecc_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_9af2d52683113ecc_6.dds
new file mode 100755
index 00000000..ce226ea2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_9af2d52683113ecc_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_a28e2885c4fe7e1c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_a28e2885c4fe7e1c_5.dds
new file mode 100755
index 00000000..4b48fc19
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_a28e2885c4fe7e1c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_b0c321687c7a410b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_b0c321687c7a410b_5.dds
new file mode 100755
index 00000000..41cf4423
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_b0c321687c7a410b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_c3af34349deab463_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_c3af34349deab463_6.dds
new file mode 100755
index 00000000..401437f9
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_c3af34349deab463_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_cb44bdce7a961a9d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_cb44bdce7a961a9d_5.dds
new file mode 100755
index 00000000..1b860364
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_cb44bdce7a961a9d_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_ce9f9d8116478553_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_ce9f9d8116478553_6.dds
new file mode 100755
index 00000000..5e21399a
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_ce9f9d8116478553_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_d3576576ea854c06_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_d3576576ea854c06_4.dds
new file mode 100755
index 00000000..b3b46eec
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_d3576576ea854c06_4.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f0599000a4f68a36_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f0599000a4f68a36_5.dds
new file mode 100755
index 00000000..ae978026
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f0599000a4f68a36_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f26190a488d42e7c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f26190a488d42e7c_5.dds
new file mode 100755
index 00000000..a6e9c386
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_32x32_f26190a488d42e7c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_40x32_4c3b4cc767632866_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_40x32_4c3b4cc767632866_6.dds
new file mode 100755
index 00000000..49306f53
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_40x32_4c3b4cc767632866_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_1606dfde024ac097_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_1606dfde024ac097_5.dds
new file mode 100755
index 00000000..1dc04bb2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_1606dfde024ac097_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_16a58a4eea792bbe_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_16a58a4eea792bbe_5.dds
new file mode 100755
index 00000000..1dc04bb2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_16a58a4eea792bbe_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_175a89d65955dc3b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_175a89d65955dc3b_5.dds
new file mode 100755
index 00000000..1e7a64bd
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_175a89d65955dc3b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_42ca5ae71fc5a4dd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_42ca5ae71fc5a4dd_5.dds
new file mode 100755
index 00000000..70d3a118
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_42ca5ae71fc5a4dd_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_ffeb4d8af2d792d8_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_ffeb4d8af2d792d8_5.dds
new file mode 100755
index 00000000..70d3a118
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_64x32_ffeb4d8af2d792d8_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_23cf53ad89c9fd1b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_23cf53ad89c9fd1b_5.dds
new file mode 100755
index 00000000..a8080b98
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_23cf53ad89c9fd1b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_59808344c616ced7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_59808344c616ced7_5.dds
new file mode 100755
index 00000000..ebfa5ce9
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_59808344c616ced7_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_6ac1c1da82026c89_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_6ac1c1da82026c89_5.dds
new file mode 100755
index 00000000..e6576b7f
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_6ac1c1da82026c89_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_70ff98b99f564308_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_70ff98b99f564308_5.dds
new file mode 100755
index 00000000..b52787ee
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_70ff98b99f564308_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_75914a5d05565cd7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_75914a5d05565cd7_5.dds
new file mode 100755
index 00000000..372fef7d
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_75914a5d05565cd7_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_7fbc4a84faef18ee_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_7fbc4a84faef18ee_5.dds
new file mode 100755
index 00000000..a01f2c02
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_7fbc4a84faef18ee_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_86d6d4197093f397_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_86d6d4197093f397_5.dds
new file mode 100755
index 00000000..5d3e66a2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_86d6d4197093f397_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_93dd5118ba11a908_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_93dd5118ba11a908_5.dds
new file mode 100755
index 00000000..817084a3
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_93dd5118ba11a908_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_a05f9156a9b8da71_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_a05f9156a9b8da71_5.dds
new file mode 100755
index 00000000..4b63c499
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/Common/tex1_76x32_a05f9156a9b8da71_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_2a304e0fc49a883c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_2a304e0fc49a883c_5.dds
new file mode 100755
index 00000000..370a56d5
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_2a304e0fc49a883c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_54e294522955b32e_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_54e294522955b32e_5.dds
new file mode 100755
index 00000000..10ba12a2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_54e294522955b32e_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_5945fd1a085a2aeb_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_5945fd1a085a2aeb_5.dds
new file mode 100755
index 00000000..3fa8125d
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_5945fd1a085a2aeb_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_701e7c156583abfc_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_701e7c156583abfc_5.dds
new file mode 100755
index 00000000..84fc5f3a
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_701e7c156583abfc_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_7e31a38b70ecbddd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_7e31a38b70ecbddd_5.dds
new file mode 100755
index 00000000..61794a2e
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_7e31a38b70ecbddd_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_86475f276fb14e06_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_86475f276fb14e06_5.dds
new file mode 100755
index 00000000..69527151
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_86475f276fb14e06_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a28e2885c4fe7e1c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a28e2885c4fe7e1c_5.dds
new file mode 100755
index 00000000..4b48fc19
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a28e2885c4fe7e1c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a7ef87b56d6b4bdf_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a7ef87b56d6b4bdf_5.dds
new file mode 100755
index 00000000..3eeb3a14
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_a7ef87b56d6b4bdf_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_b4f4fb242799c981_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_b4f4fb242799c981_5.dds
new file mode 100755
index 00000000..61794a2e
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_b4f4fb242799c981_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_bb3467a83b7dad05_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_bb3467a83b7dad05_5.dds
new file mode 100755
index 00000000..03d55374
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_bb3467a83b7dad05_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_cb44bdce7a961a9d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_cb44bdce7a961a9d_5.dds
new file mode 100755
index 00000000..1b860364
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_cb44bdce7a961a9d_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_e74dc87e7b4eef8d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_e74dc87e7b4eef8d_5.dds
new file mode 100755
index 00000000..1f6a9b9b
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_e74dc87e7b4eef8d_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f0599000a4f68a36_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f0599000a4f68a36_5.dds
new file mode 100755
index 00000000..ae978026
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f0599000a4f68a36_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f26190a488d42e7c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f26190a488d42e7c_5.dds
new file mode 100755
index 00000000..a6e9c386
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_32x32_f26190a488d42e7c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_1606dfde024ac097_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_1606dfde024ac097_5.dds
new file mode 100755
index 00000000..1dc04bb2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_1606dfde024ac097_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_16a58a4eea792bbe_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_16a58a4eea792bbe_5.dds
new file mode 100755
index 00000000..1dc04bb2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_16a58a4eea792bbe_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_175a89d65955dc3b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_175a89d65955dc3b_5.dds
new file mode 100755
index 00000000..1e7a64bd
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_175a89d65955dc3b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_27dedcf777de34c0_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_27dedcf777de34c0_5.dds
new file mode 100755
index 00000000..40f570c3
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_27dedcf777de34c0_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_3ee19d4f14128a9b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_3ee19d4f14128a9b_5.dds
new file mode 100755
index 00000000..a4832741
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_3ee19d4f14128a9b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_41703e382ee91ba1_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_41703e382ee91ba1_5.dds
new file mode 100755
index 00000000..e760a4a4
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_41703e382ee91ba1_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_42ca5ae71fc5a4dd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_42ca5ae71fc5a4dd_5.dds
new file mode 100755
index 00000000..70d3a118
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_42ca5ae71fc5a4dd_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_47dc2607b727f563_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_47dc2607b727f563_5.dds
new file mode 100755
index 00000000..0b493f32
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_47dc2607b727f563_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_4f0ad2e2995bddb5_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_4f0ad2e2995bddb5_5.dds
new file mode 100755
index 00000000..5f0f7953
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_4f0ad2e2995bddb5_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_569c97647cd0e0c9_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_569c97647cd0e0c9_5.dds
new file mode 100755
index 00000000..f3157353
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_569c97647cd0e0c9_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_63eacd0666203c96_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_63eacd0666203c96_5.dds
new file mode 100755
index 00000000..0b493f32
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_63eacd0666203c96_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_92a58bc7eb71f53d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_92a58bc7eb71f53d_5.dds
new file mode 100755
index 00000000..d8858483
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_92a58bc7eb71f53d_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_9fb461fb5a0c4962_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_9fb461fb5a0c4962_5.dds
new file mode 100755
index 00000000..24658ae3
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_9fb461fb5a0c4962_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_af76096726fc1854_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_af76096726fc1854_14.dds
new file mode 100755
index 00000000..dcc69f84
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_af76096726fc1854_14.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b0a79df2f424260e_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b0a79df2f424260e_5.dds
new file mode 100755
index 00000000..07291e4f
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b0a79df2f424260e_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b6ee0b617b179b2c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b6ee0b617b179b2c_5.dds
new file mode 100755
index 00000000..07291e4f
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_b6ee0b617b179b2c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_bf152ef2b7f5c2fd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_bf152ef2b7f5c2fd_5.dds
new file mode 100755
index 00000000..a5a48a08
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_bf152ef2b7f5c2fd_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f09993aa62c3a11b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f09993aa62c3a11b_5.dds
new file mode 100755
index 00000000..53136672
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f09993aa62c3a11b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f3f27c5e92f56472_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f3f27c5e92f56472_5.dds
new file mode 100755
index 00000000..56ae6fb6
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_f3f27c5e92f56472_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_ffeb4d8af2d792d8_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_ffeb4d8af2d792d8_5.dds
new file mode 100755
index 00000000..70d3a118
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_64x32_ffeb4d8af2d792d8_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_23cf53ad89c9fd1b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_23cf53ad89c9fd1b_5.dds
new file mode 100755
index 00000000..a8080b98
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_23cf53ad89c9fd1b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_59808344c616ced7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_59808344c616ced7_5.dds
new file mode 100755
index 00000000..ebfa5ce9
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_59808344c616ced7_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_6ac1c1da82026c89_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_6ac1c1da82026c89_5.dds
new file mode 100755
index 00000000..e6576b7f
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_6ac1c1da82026c89_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_70ff98b99f564308_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_70ff98b99f564308_5.dds
new file mode 100755
index 00000000..b52787ee
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_70ff98b99f564308_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_75914a5d05565cd7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_75914a5d05565cd7_5.dds
new file mode 100755
index 00000000..372fef7d
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_75914a5d05565cd7_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_7fbc4a84faef18ee_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_7fbc4a84faef18ee_5.dds
new file mode 100755
index 00000000..a01f2c02
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_7fbc4a84faef18ee_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_86d6d4197093f397_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_86d6d4197093f397_5.dds
new file mode 100755
index 00000000..5d3e66a2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_86d6d4197093f397_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_93dd5118ba11a908_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_93dd5118ba11a908_5.dds
new file mode 100755
index 00000000..817084a3
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_93dd5118ba11a908_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_a05f9156a9b8da71_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_a05f9156a9b8da71_5.dds
new file mode 100755
index 00000000..4b63c499
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP1/tex1_76x32_a05f9156a9b8da71_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_2a304e0fc49a883c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_2a304e0fc49a883c_5.dds
new file mode 100755
index 00000000..370a56d5
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_2a304e0fc49a883c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_4eb90bb511d2b10e_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_4eb90bb511d2b10e_4.dds
new file mode 100755
index 00000000..25a64ccd
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_4eb90bb511d2b10e_4.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_54e294522955b32e_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_54e294522955b32e_5.dds
new file mode 100755
index 00000000..10ba12a2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_54e294522955b32e_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5945fd1a085a2aeb_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5945fd1a085a2aeb_5.dds
new file mode 100755
index 00000000..3fa8125d
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5945fd1a085a2aeb_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5fa30f82f962b236_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5fa30f82f962b236_5.dds
new file mode 100755
index 00000000..b356c86c
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_5fa30f82f962b236_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_615ec0bfb80acb1d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_615ec0bfb80acb1d_5.dds
new file mode 100755
index 00000000..ae25c147
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_615ec0bfb80acb1d_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_701e7c156583abfc_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_701e7c156583abfc_5.dds
new file mode 100755
index 00000000..84fc5f3a
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_701e7c156583abfc_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_7e31a38b70ecbddd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_7e31a38b70ecbddd_5.dds
new file mode 100755
index 00000000..61794a2e
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_7e31a38b70ecbddd_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_86475f276fb14e06_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_86475f276fb14e06_5.dds
new file mode 100755
index 00000000..69527151
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_86475f276fb14e06_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_a28e2885c4fe7e1c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_a28e2885c4fe7e1c_5.dds
new file mode 100755
index 00000000..4b48fc19
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_a28e2885c4fe7e1c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_bb3467a83b7dad05_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_bb3467a83b7dad05_5.dds
new file mode 100755
index 00000000..03d55374
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_bb3467a83b7dad05_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_cb44bdce7a961a9d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_cb44bdce7a961a9d_5.dds
new file mode 100755
index 00000000..1b860364
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_cb44bdce7a961a9d_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dbcb14f0171b30d3_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dbcb14f0171b30d3_5.dds
new file mode 100755
index 00000000..08a6563e
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dbcb14f0171b30d3_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dfe44df2c8105710_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dfe44df2c8105710_5.dds
new file mode 100755
index 00000000..e181d134
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_dfe44df2c8105710_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f0599000a4f68a36_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f0599000a4f68a36_5.dds
new file mode 100755
index 00000000..ae978026
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f0599000a4f68a36_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f26190a488d42e7c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f26190a488d42e7c_5.dds
new file mode 100755
index 00000000..a6e9c386
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f26190a488d42e7c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f2e2eeb12e0e82c0_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f2e2eeb12e0e82c0_5.dds
new file mode 100755
index 00000000..ae978026
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_32x32_f2e2eeb12e0e82c0_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0064d1faaf79a1de_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0064d1faaf79a1de_5.dds
new file mode 100755
index 00000000..a5a48a08
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0064d1faaf79a1de_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0749accc3ceb7f65_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0749accc3ceb7f65_5.dds
new file mode 100755
index 00000000..24658ae3
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0749accc3ceb7f65_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0d85d548a5776b9c_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0d85d548a5776b9c_5.dds
new file mode 100755
index 00000000..f3157353
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_0d85d548a5776b9c_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1606dfde024ac097_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1606dfde024ac097_5.dds
new file mode 100755
index 00000000..1dc04bb2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1606dfde024ac097_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_16a58a4eea792bbe_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_16a58a4eea792bbe_5.dds
new file mode 100755
index 00000000..1dc04bb2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_16a58a4eea792bbe_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_175a89d65955dc3b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_175a89d65955dc3b_5.dds
new file mode 100755
index 00000000..1e7a64bd
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_175a89d65955dc3b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1bf2957bffda8c54_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1bf2957bffda8c54_5.dds
new file mode 100755
index 00000000..a5a48a08
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_1bf2957bffda8c54_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_360b0a27d8d03e02_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_360b0a27d8d03e02_5.dds
new file mode 100755
index 00000000..24658ae3
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_360b0a27d8d03e02_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_42ca5ae71fc5a4dd_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_42ca5ae71fc5a4dd_5.dds
new file mode 100755
index 00000000..70d3a118
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_42ca5ae71fc5a4dd_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_4bb466582c2d7aff_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_4bb466582c2d7aff_5.dds
new file mode 100755
index 00000000..3aa4e708
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_4bb466582c2d7aff_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cf2ab7d53aae895_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cf2ab7d53aae895_5.dds
new file mode 100755
index 00000000..40f570c3
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cf2ab7d53aae895_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cfc7cc23de5c69b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cfc7cc23de5c69b_5.dds
new file mode 100755
index 00000000..56ae6fb6
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_6cfc7cc23de5c69b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_7a518177afff0bc2_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_7a518177afff0bc2_5.dds
new file mode 100755
index 00000000..d8858483
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_7a518177afff0bc2_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_835ed629d0fed238_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_835ed629d0fed238_5.dds
new file mode 100755
index 00000000..53136672
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_835ed629d0fed238_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_af76096726fc1854_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_af76096726fc1854_14.dds
new file mode 100755
index 00000000..dcc69f84
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_af76096726fc1854_14.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_bfdffec3c8943aea_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_bfdffec3c8943aea_5.dds
new file mode 100755
index 00000000..40f570c3
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_bfdffec3c8943aea_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_c5fa21384e2e25f7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_c5fa21384e2e25f7_5.dds
new file mode 100755
index 00000000..a5a48a08
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_c5fa21384e2e25f7_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ec8bc72a0c6b2b7d_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ec8bc72a0c6b2b7d_5.dds
new file mode 100755
index 00000000..26cdbaba
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ec8bc72a0c6b2b7d_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f5cdd86ad2b9b9c3_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f5cdd86ad2b9b9c3_5.dds
new file mode 100755
index 00000000..a4832741
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f5cdd86ad2b9b9c3_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f86841b072527b52_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f86841b072527b52_5.dds
new file mode 100755
index 00000000..e760a4a4
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_f86841b072527b52_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ffeb4d8af2d792d8_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ffeb4d8af2d792d8_5.dds
new file mode 100755
index 00000000..70d3a118
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x32_ffeb4d8af2d792d8_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x64_db014c47357a98a2_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x64_db014c47357a98a2_5.dds
new file mode 100755
index 00000000..cd6a6ac0
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_64x64_db014c47357a98a2_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_23cf53ad89c9fd1b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_23cf53ad89c9fd1b_5.dds
new file mode 100755
index 00000000..a8080b98
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_23cf53ad89c9fd1b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_59808344c616ced7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_59808344c616ced7_5.dds
new file mode 100755
index 00000000..ebfa5ce9
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_59808344c616ced7_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_6ac1c1da82026c89_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_6ac1c1da82026c89_5.dds
new file mode 100755
index 00000000..e6576b7f
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_6ac1c1da82026c89_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_70ff98b99f564308_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_70ff98b99f564308_5.dds
new file mode 100755
index 00000000..b52787ee
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_70ff98b99f564308_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_75914a5d05565cd7_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_75914a5d05565cd7_5.dds
new file mode 100755
index 00000000..372fef7d
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_75914a5d05565cd7_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_7fbc4a84faef18ee_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_7fbc4a84faef18ee_5.dds
new file mode 100755
index 00000000..a01f2c02
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_7fbc4a84faef18ee_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_86d6d4197093f397_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_86d6d4197093f397_5.dds
new file mode 100755
index 00000000..5d3e66a2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_86d6d4197093f397_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_93dd5118ba11a908_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_93dd5118ba11a908_5.dds
new file mode 100755
index 00000000..817084a3
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_93dd5118ba11a908_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_a05f9156a9b8da71_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_a05f9156a9b8da71_5.dds
new file mode 100755
index 00000000..4b63c499
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP2/tex1_76x32_a05f9156a9b8da71_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_05ace719b52918bb_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_05ace719b52918bb_6.dds
new file mode 100755
index 00000000..217903fa
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_05ace719b52918bb_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_40ea01bf6f2aceae_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_40ea01bf6f2aceae_6.dds
new file mode 100755
index 00000000..217903fa
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_128x115_40ea01bf6f2aceae_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_10ca6dca25531ce9_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_10ca6dca25531ce9_4.dds
new file mode 100755
index 00000000..b2429513
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_10ca6dca25531ce9_4.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_2d9b5d2d0a406a63_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_2d9b5d2d0a406a63_6.dds
new file mode 100755
index 00000000..f1bc7e00
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_2d9b5d2d0a406a63_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_380a4ed102753a91_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_380a4ed102753a91_6.dds
new file mode 100755
index 00000000..b2917cae
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_380a4ed102753a91_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_43be3d9c0c2e2dbd_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_43be3d9c0c2e2dbd_6.dds
new file mode 100755
index 00000000..3fa8125d
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_43be3d9c0c2e2dbd_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_4eb90bb511d2b10e_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_4eb90bb511d2b10e_4.dds
new file mode 100755
index 00000000..dd7beb5e
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_4eb90bb511d2b10e_4.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_52bc65cd8d4b0905_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_52bc65cd8d4b0905_6.dds
new file mode 100755
index 00000000..08a6563e
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_52bc65cd8d4b0905_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_70a90df632629730_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_70a90df632629730_4.dds
new file mode 100755
index 00000000..543933e8
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_70a90df632629730_4.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_877ac67dc3c23f97_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_877ac67dc3c23f97_6.dds
new file mode 100755
index 00000000..ea207b1b
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_877ac67dc3c23f97_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_8a3e8ec9d97c84f7_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_8a3e8ec9d97c84f7_6.dds
new file mode 100755
index 00000000..b356c86c
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_8a3e8ec9d97c84f7_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_96342171475066ab_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_96342171475066ab_6.dds
new file mode 100755
index 00000000..fa710c85
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_96342171475066ab_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_975e1a31b02a2a68_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_975e1a31b02a2a68_6.dds
new file mode 100755
index 00000000..09b425ed
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_975e1a31b02a2a68_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_9af2d52683113ecc_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_9af2d52683113ecc_6.dds
new file mode 100755
index 00000000..ce226ea2
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_9af2d52683113ecc_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b0c321687c7a410b_5.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b0c321687c7a410b_5.dds
new file mode 100755
index 00000000..41cf4423
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b0c321687c7a410b_5.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b7bcef92f3f7378d_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b7bcef92f3f7378d_6.dds
new file mode 100755
index 00000000..55033668
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_b7bcef92f3f7378d_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_d3576576ea854c06_4.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_d3576576ea854c06_4.dds
new file mode 100755
index 00000000..b3b46eec
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_d3576576ea854c06_4.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_e81f99c205eb24d0_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_e81f99c205eb24d0_6.dds
new file mode 100755
index 00000000..072bbb0c
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_e81f99c205eb24d0_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_f00e0e837140250a_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_f00e0e837140250a_6.dds
new file mode 100755
index 00000000..676ada0d
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_32x32_f00e0e837140250a_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_4c3b4cc767632866_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_4c3b4cc767632866_6.dds
new file mode 100755
index 00000000..49306f53
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_4c3b4cc767632866_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_970859e57fe24761_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_970859e57fe24761_6.dds
new file mode 100755
index 00000000..15b5fcc8
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_970859e57fe24761_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_a60e7e0eac9a75e7_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_a60e7e0eac9a75e7_6.dds
new file mode 100755
index 00000000..a71750ff
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_a60e7e0eac9a75e7_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_bf0e66339a12f23a_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_bf0e66339a12f23a_6.dds
new file mode 100755
index 00000000..10c1a002
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_bf0e66339a12f23a_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_e65a03d74465035d_6.dds b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_e65a03d74465035d_6.dds
new file mode 100755
index 00000000..9b7a4824
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Steam Deck Button Prompts/MP3/tex1_40x32_e65a03d74465035d_6.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_19d4c177bfa5255a_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_19d4c177bfa5255a_14.dds
new file mode 100755
index 00000000..7df18eaa
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_19d4c177bfa5255a_14.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_344dcedb01a9a7ff_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_344dcedb01a9a7ff_14.dds
new file mode 100755
index 00000000..7df18eaa
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_344dcedb01a9a7ff_14.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_5767fae3e9c2ec7b_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_5767fae3e9c2ec7b_14.dds
new file mode 100755
index 00000000..7df18eaa
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_5767fae3e9c2ec7b_14.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_ad15d2f8f67a24d8_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_ad15d2f8f67a24d8_14.dds
new file mode 100755
index 00000000..9234004c
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_ad15d2f8f67a24d8_14.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_d7651895d8b4b6e0_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_d7651895d8b4b6e0_14.dds
new file mode 100755
index 00000000..7df18eaa
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_d7651895d8b4b6e0_14.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_daf65c9d00a79c85_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_daf65c9d00a79c85_14.dds
new file mode 100755
index 00000000..7df18eaa
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_daf65c9d00a79c85_14.dds differ
diff --git a/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_f4681588babc937c_14.dds b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_f4681588babc937c_14.dds
new file mode 100755
index 00000000..7df18eaa
Binary files /dev/null and b/emu-configs/primehack/data/R3M/0EXTRA - Wiimote Warning Replacement/tex1_832x456_f4681588babc937c_14.dds differ
diff --git a/emu-configs/retroarch/ScummVM.zip b/emu-configs/retroarch/ScummVM.zip
new file mode 100644
index 00000000..33e351e3
Binary files /dev/null and b/emu-configs/retroarch/ScummVM.zip differ
diff --git a/emu-configs/retroarch/retroarch-core-options.cfg b/emu-configs/retroarch/retroarch-core-options.cfg
index 06420de7..be802a61 100644
--- a/emu-configs/retroarch/retroarch-core-options.cfg
+++ b/emu-configs/retroarch/retroarch-core-options.cfg
@@ -59,17 +59,19 @@ cap32_scr_intensity = "8"
cap32_scr_tube = "color"
cap32_statusbar = "onloading"
citra_analog_function = "C-Stick and Touchscreen Pointer"
+citra_cpu_scale = "100% (Default)"
citra_custom_textures = "disabled"
citra_deadzone = "15"
citra_dump_textures = "disabled"
-citra_is_new_3ds = "Old 3DS"
+citra_is_new_3ds = "New 3DS"
citra_language = "English"
citra_layout_option = "Default Top-Bottom Screen"
citra_mouse_touchscreen = "enabled"
citra_region_value = "Auto"
citra_render_touchscreen = "disabled"
-citra_resolution_factor = "4x"
+citra_resolution_factor = "2x"
citra_swap_screen = "Top"
+citra_swap_screen_mode = "Toggle"
citra_texture_filter = "none"
citra_touch_touchscreen = "enabled"
citra_use_acc_geo_shaders = "enabled"
@@ -419,6 +421,7 @@ mgba_sgb_borders = "ON"
mgba_skip_bios = "OFF"
mgba_solar_sensor_level = "0"
mgba_use_bios = "ON"
+mesen_fdsautoinsertdisk = "enabled"
mupen64plus-169screensize = "960x540"
mupen64plus-43screensize = "640x480"
mupen64plus-alt-map = "False"
diff --git a/emu-configs/retroarch/retroarch.cfg b/emu-configs/retroarch/retroarch.cfg
index 2fc14c02..dc533f2e 100644
--- a/emu-configs/retroarch/retroarch.cfg
+++ b/emu-configs/retroarch/retroarch.cfg
@@ -3,10 +3,14 @@ accessibility_narrator_speech_speed = "5"
ai_service_enable = "false"
ai_service_mode = "1"
ai_service_pause = "false"
+ai_service_poll_delay = "0"
ai_service_source_lang = "0"
ai_service_target_lang = "0"
+ai_service_text_padding = "5"
+ai_service_text_position = "0"
ai_service_url = "http://localhost:4404/"
all_users_control_menu = "true"
+app_icon = "default"
apply_cheats_after_load = "false"
apply_cheats_after_toggle = "false"
aspect_ratio_index = "22"
@@ -23,6 +27,7 @@ audio_enable_menu_notice = "false"
audio_enable_menu_ok = "false"
audio_enable_menu_scroll = "false"
audio_fastforward_mute = "false"
+audio_fastforward_speedup = "false"
audio_filter_dir = "/app/lib/retroarch/filters/audio"
audio_latency = "64"
audio_max_timing_skew = "0.050000"
@@ -43,8 +48,8 @@ auto_shaders_enable = "true"
autosave_interval = "10"
block_sram_overwrite = "false"
bluetooth_driver = "null"
-builtin_imageviewer_enable = "true"
-builtin_mediaplayer_enable = "true"
+builtin_imageviewer_enable = "false"
+builtin_mediaplayer_enable = "false"
bundle_assets_dst_path = ""
bundle_assets_dst_path_subdir = ""
bundle_assets_extract_enable = "false"
@@ -77,9 +82,17 @@ cheevos_unlock_sound_enable = "true"
cheevos_username = ""
cheevos_verbose_enable = "true"
cheevos_visibility_account = "true"
+cheevos_visibility_lboard_cancel = "true"
+cheevos_visibility_lboard_start = "true"
+cheevos_visibility_lboard_submit = "true"
+cheevos_visibility_lboard_trackers = "true"
cheevos_visibility_mastery = "true"
+cheevos_visibility_progress_tracker = "true"
cheevos_visibility_summary = "1"
cheevos_visibility_unlock = "true"
+cloud_sync_destructive = "false"
+cloud_sync_driver = ""
+cloud_sync_enable = "false"
config_save_on_exit = "true"
content_database_path = "/app/share/libretro/database/rdb"
content_favorites_directory = "default"
@@ -159,10 +172,12 @@ gamemode_enable = "false"
gamma_correction = "0"
global_core_options = "true"
history_list_enable = "true"
+initial_disk_change_enable = "true"
input_ai_service = "i"
input_ai_service_axis = "nul"
input_ai_service_btn = "nul"
input_ai_service_mbtn = "nul"
+input_allow_turbo_dpad = "false"
input_analog_deadzone = "0.000000"
input_analog_sensitivity = "1.000000"
input_audio_mute = "nul"
@@ -264,6 +279,7 @@ input_hold_slowmotion_axis = "nul"
input_hold_slowmotion_btn = "nul"
input_hold_slowmotion_mbtn = "nul"
input_hotkey_block_delay = "5"
+input_hotkey_device_merge = "false"
input_joypad_driver = "sdl2"
input_keyboard_layout = ""
input_load_state = "a"
@@ -301,6 +317,9 @@ input_netplay_player_chat_axis = "nul"
input_netplay_player_chat_btn = "nul"
input_netplay_player_chat_mbtn = "nul"
input_nowinkey_enable = "false"
+input_osk_overlay = ""
+input_osk_overlay_auto_scale = "false"
+input_osk_overlay_opacity = "0.700000"
input_osk_toggle = "f12"
input_osk_toggle_axis = "nul"
input_osk_toggle_btn = "nul"
@@ -317,11 +336,25 @@ input_overlay_enable = "true"
input_overlay_enable_autopreferred = "true"
input_overlay_hide_in_menu = "false"
input_overlay_hide_when_gamepad_connected = "false"
+input_overlay_lightgun_allow_offscreen = "true"
+input_overlay_lightgun_four_touch_input = "0"
+input_overlay_lightgun_port = "-1"
+input_overlay_lightgun_three_touch_input = "0"
+input_overlay_lightgun_trigger_delay = "1"
+input_overlay_lightgun_trigger_on_touch = "true"
+input_overlay_lightgun_two_touch_input = "0"
+input_overlay_mouse_dtap_msec = "200"
+input_overlay_mouse_dtap_to_drag = "false"
+input_overlay_mouse_hold_msec = "200"
+input_overlay_mouse_hold_to_drag = "true"
+input_overlay_mouse_speed = "1.000000"
+input_overlay_mouse_swipe_threshold = "1.000000"
input_overlay_next = "nul"
input_overlay_next_axis = "nul"
input_overlay_next_btn = "nul"
input_overlay_next_mbtn = "nul"
input_overlay_opacity = "0.700000"
+input_overlay_pointer_enable = "false"
input_overlay_scale_landscape = "1.000000"
input_overlay_scale_portrait = "1.000000"
input_overlay_show_inputs = "2"
@@ -347,7 +380,7 @@ input_player10_a = "nul"
input_player10_a_axis = "nul"
input_player10_a_btn = "nul"
input_player10_a_mbtn = "nul"
-input_player10_analog_dpad_mode = "0"
+input_player10_analog_dpad_mode = "1"
input_player10_b = "nul"
input_player10_b_axis = "nul"
input_player10_b_btn = "nul"
@@ -494,7 +527,7 @@ input_player11_a = "nul"
input_player11_a_axis = "nul"
input_player11_a_btn = "nul"
input_player11_a_mbtn = "nul"
-input_player11_analog_dpad_mode = "0"
+input_player11_analog_dpad_mode = "1"
input_player11_b = "nul"
input_player11_b_axis = "nul"
input_player11_b_btn = "nul"
@@ -641,7 +674,7 @@ input_player12_a = "nul"
input_player12_a_axis = "nul"
input_player12_a_btn = "nul"
input_player12_a_mbtn = "nul"
-input_player12_analog_dpad_mode = "0"
+input_player12_analog_dpad_mode = "1"
input_player12_b = "nul"
input_player12_b_axis = "nul"
input_player12_b_btn = "nul"
@@ -788,7 +821,7 @@ input_player13_a = "nul"
input_player13_a_axis = "nul"
input_player13_a_btn = "nul"
input_player13_a_mbtn = "nul"
-input_player13_analog_dpad_mode = "0"
+input_player13_analog_dpad_mode = "1"
input_player13_b = "nul"
input_player13_b_axis = "nul"
input_player13_b_btn = "nul"
@@ -935,7 +968,7 @@ input_player14_a = "nul"
input_player14_a_axis = "nul"
input_player14_a_btn = "nul"
input_player14_a_mbtn = "nul"
-input_player14_analog_dpad_mode = "0"
+input_player14_analog_dpad_mode = "1"
input_player14_b = "nul"
input_player14_b_axis = "nul"
input_player14_b_btn = "nul"
@@ -1082,7 +1115,7 @@ input_player15_a = "nul"
input_player15_a_axis = "nul"
input_player15_a_btn = "nul"
input_player15_a_mbtn = "nul"
-input_player15_analog_dpad_mode = "0"
+input_player15_analog_dpad_mode = "1"
input_player15_b = "nul"
input_player15_b_axis = "nul"
input_player15_b_btn = "nul"
@@ -1229,7 +1262,7 @@ input_player16_a = "nul"
input_player16_a_axis = "nul"
input_player16_a_btn = "nul"
input_player16_a_mbtn = "nul"
-input_player16_analog_dpad_mode = "0"
+input_player16_analog_dpad_mode = "1"
input_player16_b = "nul"
input_player16_b_axis = "nul"
input_player16_b_btn = "nul"
@@ -1523,7 +1556,7 @@ input_player2_a = "nul"
input_player2_a_axis = "nul"
input_player2_a_btn = "nul"
input_player2_a_mbtn = "nul"
-input_player2_analog_dpad_mode = "0"
+input_player2_analog_dpad_mode = "1"
input_player2_b = "nul"
input_player2_b_axis = "nul"
input_player2_b_btn = "nul"
@@ -1670,7 +1703,7 @@ input_player3_a = "nul"
input_player3_a_axis = "nul"
input_player3_a_btn = "nul"
input_player3_a_mbtn = "nul"
-input_player3_analog_dpad_mode = "0"
+input_player3_analog_dpad_mode = "1"
input_player3_b = "nul"
input_player3_b_axis = "nul"
input_player3_b_btn = "nul"
@@ -1817,7 +1850,7 @@ input_player4_a = "nul"
input_player4_a_axis = "nul"
input_player4_a_btn = "nul"
input_player4_a_mbtn = "nul"
-input_player4_analog_dpad_mode = "0"
+input_player4_analog_dpad_mode = "1"
input_player4_b = "nul"
input_player4_b_axis = "nul"
input_player4_b_btn = "nul"
@@ -1964,7 +1997,7 @@ input_player5_a = "nul"
input_player5_a_axis = "nul"
input_player5_a_btn = "nul"
input_player5_a_mbtn = "nul"
-input_player5_analog_dpad_mode = "0"
+input_player5_analog_dpad_mode = "1"
input_player5_b = "nul"
input_player5_b_axis = "nul"
input_player5_b_btn = "nul"
@@ -2111,7 +2144,7 @@ input_player6_a = "nul"
input_player6_a_axis = "nul"
input_player6_a_btn = "nul"
input_player6_a_mbtn = "nul"
-input_player6_analog_dpad_mode = "0"
+input_player6_analog_dpad_mode = "1"
input_player6_b = "nul"
input_player6_b_axis = "nul"
input_player6_b_btn = "nul"
@@ -2258,7 +2291,7 @@ input_player7_a = "nul"
input_player7_a_axis = "nul"
input_player7_a_btn = "nul"
input_player7_a_mbtn = "nul"
-input_player7_analog_dpad_mode = "0"
+input_player7_analog_dpad_mode = "1"
input_player7_b = "nul"
input_player7_b_axis = "nul"
input_player7_b_btn = "nul"
@@ -2405,7 +2438,7 @@ input_player8_a = "nul"
input_player8_a_axis = "nul"
input_player8_a_btn = "nul"
input_player8_a_mbtn = "nul"
-input_player8_analog_dpad_mode = "0"
+input_player8_analog_dpad_mode = "1"
input_player8_b = "nul"
input_player8_b_axis = "nul"
input_player8_b_btn = "nul"
@@ -2552,7 +2585,7 @@ input_player9_a = "nul"
input_player9_a_axis = "nul"
input_player9_a_btn = "nul"
input_player9_a_mbtn = "nul"
-input_player9_analog_dpad_mode = "0"
+input_player9_analog_dpad_mode = "1"
input_player9_b = "nul"
input_player9_b_axis = "nul"
input_player9_b_btn = "nul"
@@ -2912,6 +2945,14 @@ menu_xmb_thumbnail_scale_factor = "100"
menu_xmb_title_margin = "5"
menu_xmb_title_margin_horizontal_offset = "0"
menu_xmb_vertical_fade_factor = "100"
+microphone_block_frames = "0"
+microphone_device = ""
+microphone_driver = "alsathread"
+microphone_enable = "true"
+microphone_latency = "64"
+microphone_rate = "48000"
+microphone_resampler = "sinc"
+microphone_resampler_quality = "3"
midi_driver = "alsa"
midi_input = "OFF"
midi_output = "OFF"
@@ -2985,16 +3026,19 @@ network_remote_enable_user_p9 = "false"
notification_show_autoconfig = "true"
notification_show_cheats_applied = "true"
notification_show_config_override_load = "true"
+notification_show_disk_control = "true"
notification_show_fast_forward = "true"
notification_show_netplay_extra = "false"
notification_show_patch_applied = "true"
notification_show_refresh_rate = "true"
notification_show_remap_load = "true"
+notification_show_save_state = "true"
notification_show_screenshot = "true"
notification_show_screenshot_duration = "0"
notification_show_screenshot_flash = "0"
notification_show_set_initial_disk = "true"
notification_show_when_menu_is_alive = "false"
+osk_overlay_directory = "/var/config/retroarch/overlays/keyboards"
overlay_directory = "/var/config/retroarch/overlays/borders"
ozone_collapse_sidebar = "false"
ozone_menu_color_theme = "1"
@@ -3018,6 +3062,7 @@ playlist_show_sublabels = "true"
playlist_sort_alphabetical = "true"
playlist_sublabel_last_played_style = "0"
playlist_sublabel_runtime_type = "0"
+playlist_use_filename = "false"
playlist_use_old_format = "false"
preemptive_frames_enable = "false"
preemptive_frames_hide_warnings = "false"
@@ -3097,6 +3142,7 @@ savestate_file_compression = "true"
savestate_max_keep = "0"
savestate_thumbnail_enable = "false"
savestates_in_content_dir = "false"
+scan_serial_and_crc = "false"
scan_without_core_match = "false"
screen_brightness = "100"
screen_orientation = "0"
@@ -3141,6 +3187,7 @@ suspend_screensaver_enable = "true"
sustained_performance_mode = "false"
system_directory = "/var/config/retroarch/system"
systemfiles_in_content_dir = "false"
+test_input_file_joypad = ""
threaded_data_runloop_enable = "true"
thumbnails_directory = "/var/config/retroarch/thumbnails"
twitch_stream_key = ""
@@ -3155,7 +3202,9 @@ video_adaptive_vsync = "false"
video_allow_rotate = "true"
video_aspect_ratio = "1.333300"
video_aspect_ratio_auto = "false"
+video_autoswitch_pal_threshold = "54.500000"
video_autoswitch_refresh_rate = "0"
+video_bfi_dark_frames = "1"
video_black_frame_insertion = "0"
video_context_driver = ""
video_crop_overscan = "true"
@@ -3171,6 +3220,7 @@ video_force_aspect = "true"
video_force_srgb_disable = "false"
video_frame_delay = "0"
video_frame_delay_auto = "false"
+video_frame_rest = "false"
video_fullscreen = "true"
video_fullscreen_x = "0"
video_fullscreen_y = "0"
@@ -3209,11 +3259,13 @@ video_rotation = "0"
video_scale = "3"
video_scale_integer = "false"
video_scale_integer_overscale = "false"
+video_scan_subframes = "false"
video_shader_delay = "0"
video_shader_dir = "/var/config/retroarch/shaders"
video_shader_enable = "true"
video_shader_preset_save_reference_enable = "true"
video_shader_remember_last_dir = "false"
+video_shader_subframes = "1"
video_shader_watch_files = "false"
video_shared_context = "false"
video_smooth = "false"
@@ -3239,6 +3291,9 @@ video_windowed_position_x = "0"
video_windowed_position_y = "0"
vrr_runloop_enable = "false"
vulkan_gpu_index = "0"
+webdav_password = ""
+webdav_url = ""
+webdav_username = ""
wifi_driver = "null"
wifi_enabled = "true"
xmb_alpha_factor = "75"
diff --git a/emu-configs/retroarch/scummvm.ini b/emu-configs/retroarch/scummvm.ini
new file mode 100644
index 00000000..e32bbf21
--- /dev/null
+++ b/emu-configs/retroarch/scummvm.ini
@@ -0,0 +1,30 @@
+[scummvm]
+libretro_hooks_clear=false
+iconspath=
+mute=false
+speech_volume=192
+native_mt32=false
+mt32_device=null
+libretro_playlist_version=0
+savepath=
+confirm_exit=false
+gui_use_game_language=false
+extrapath=
+gui_scale=100
+gui_return_to_launcher_at_exit=false
+gui_disable_fixed_font_scaling=false
+fullscreen=true
+gui_browser_show_hidden=false
+browser_lastpath=
+libretro_playlist_path=/var/config/retroarch/playlists
+themepath=
+sfx_volume=192
+music_volume=192
+autosave_period=300
+gm_device=auto
+music_driver=auto
+opl_driver=auto
+speech_mute=false
+gui_language=en
+libretro_hooks_location=0
+
diff --git a/emu-configs/rpcs3/GuiConfigs/CurrentSettings.ini b/emu-configs/rpcs3/GuiConfigs/CurrentSettings.ini
index b4dba439..0ef87f08 100644
--- a/emu-configs/rpcs3/GuiConfigs/CurrentSettings.ini
+++ b/emu-configs/rpcs3/GuiConfigs/CurrentSettings.ini
@@ -47,4 +47,5 @@ main_window_stop=Ctrl+Q
main_window_toggle_fullscreen=Ctrl+Return
[main_window]
-infoBoxEnabledWelcome=false
\ No newline at end of file
+confirmationBoxExitGame=false
+infoBoxEnabledWelcome=false
diff --git a/emu-configs/rpcs3/input_configs/global/Default.yml b/emu-configs/rpcs3/input_configs/global/Default.yml
index 58f42cdf..a001bfd0 100644
--- a/emu-configs/rpcs3/input_configs/global/Default.yml
+++ b/emu-configs/rpcs3/input_configs/global/Default.yml
@@ -40,7 +40,241 @@ Player 1 Input:
Mirrored: false
Shift: 0
Motion Sensor G:
- Axis: RY
+ Axis: RX
+ Mirrored: false
+ Shift: 0
+ Pressure Intensity Button: ""
+ Pressure Intensity Percent: 50
+ Left Stick Multiplier: 100
+ Right Stick Multiplier: 100
+ Left Stick Deadzone: 30
+ Right Stick Deadzone: 30
+ Left Trigger Threshold: 0
+ Right Trigger Threshold: 0
+ Left Pad Squircling Factor: 5000
+ Right Pad Squircling Factor: 5000
+ Color Value R: 0
+ Color Value G: 0
+ Color Value B: 20
+ Blink LED when battery is below 20%: true
+ Use LED as a battery indicator: false
+ LED battery indicator brightness: 10
+ Player LED enabled: true
+ Enable Large Vibration Motor: true
+ Enable Small Vibration Motor: true
+ Switch Vibration Motors: false
+ Mouse Movement Mode: Relative
+ Mouse Deadzone X Axis: 60
+ Mouse Deadzone Y Axis: 60
+ Mouse Acceleration X Axis: 200
+ Mouse Acceleration Y Axis: 250
+ Left Stick Lerp Factor: 100
+ Right Stick Lerp Factor: 100
+ Analog Button Lerp Factor: 100
+ Trigger Lerp Factor: 100
+ Device Class Type: 0
+ Vendor ID: 1356
+ Product ID: 616
+ Buddy Device: ""
+Player 2 Input:
+ Handler: Evdev
+ Device: Microsoft X-Box 360 pad 1
+ Config:
+ Left Stick Left: LX-
+ Left Stick Down: LY+
+ Left Stick Right: LX+
+ Left Stick Up: LY-
+ Right Stick Left: RX-
+ Right Stick Down: RY+
+ Right Stick Right: RX+
+ Right Stick Up: RY-
+ Start: Start
+ Select: Select
+ PS Button: Mode
+ Square: X
+ Cross: A
+ Circle: B
+ Triangle: Y
+ Left: Hat0 X-
+ Down: Hat0 Y+
+ Right: Hat0 X+
+ Up: Hat0 Y-
+ R1: TR
+ R2: RZ+
+ R3: Thumb R
+ L1: TL
+ L2: LZ+
+ L3: Thumb L
+ Motion Sensor X:
+ Axis: X
+ Mirrored: false
+ Shift: 0
+ Motion Sensor Y:
+ Axis: Y
+ Mirrored: false
+ Shift: 0
+ Motion Sensor Z:
+ Axis: Z
+ Mirrored: false
+ Shift: 0
+ Motion Sensor G:
+ Axis: RX
+ Mirrored: false
+ Shift: 0
+ Pressure Intensity Button: ""
+ Pressure Intensity Percent: 50
+ Left Stick Multiplier: 100
+ Right Stick Multiplier: 100
+ Left Stick Deadzone: 30
+ Right Stick Deadzone: 30
+ Left Trigger Threshold: 0
+ Right Trigger Threshold: 0
+ Left Pad Squircling Factor: 5000
+ Right Pad Squircling Factor: 5000
+ Color Value R: 0
+ Color Value G: 0
+ Color Value B: 20
+ Blink LED when battery is below 20%: true
+ Use LED as a battery indicator: false
+ LED battery indicator brightness: 10
+ Player LED enabled: true
+ Enable Large Vibration Motor: true
+ Enable Small Vibration Motor: true
+ Switch Vibration Motors: false
+ Mouse Movement Mode: Relative
+ Mouse Deadzone X Axis: 60
+ Mouse Deadzone Y Axis: 60
+ Mouse Acceleration X Axis: 200
+ Mouse Acceleration Y Axis: 250
+ Left Stick Lerp Factor: 100
+ Right Stick Lerp Factor: 100
+ Analog Button Lerp Factor: 100
+ Trigger Lerp Factor: 100
+ Device Class Type: 0
+ Vendor ID: 1356
+ Product ID: 616
+ Buddy Device: ""
+Player 3 Input:
+ Handler: Evdev
+ Device: Microsoft X-Box 360 pad 2
+ Config:
+ Left Stick Left: LX-
+ Left Stick Down: LY+
+ Left Stick Right: LX+
+ Left Stick Up: LY-
+ Right Stick Left: RX-
+ Right Stick Down: RY+
+ Right Stick Right: RX+
+ Right Stick Up: RY-
+ Start: Start
+ Select: Select
+ PS Button: Mode
+ Square: X
+ Cross: A
+ Circle: B
+ Triangle: Y
+ Left: Hat0 X-
+ Down: Hat0 Y+
+ Right: Hat0 X+
+ Up: Hat0 Y-
+ R1: TR
+ R2: RZ+
+ R3: Thumb R
+ L1: TL
+ L2: LZ+
+ L3: Thumb L
+ Motion Sensor X:
+ Axis: X
+ Mirrored: false
+ Shift: 0
+ Motion Sensor Y:
+ Axis: Y
+ Mirrored: false
+ Shift: 0
+ Motion Sensor Z:
+ Axis: Z
+ Mirrored: false
+ Shift: 0
+ Motion Sensor G:
+ Axis: RX
+ Mirrored: false
+ Shift: 0
+ Pressure Intensity Button: ""
+ Pressure Intensity Percent: 50
+ Left Stick Multiplier: 100
+ Right Stick Multiplier: 100
+ Left Stick Deadzone: 30
+ Right Stick Deadzone: 30
+ Left Trigger Threshold: 0
+ Right Trigger Threshold: 0
+ Left Pad Squircling Factor: 5000
+ Right Pad Squircling Factor: 5000
+ Color Value R: 0
+ Color Value G: 0
+ Color Value B: 20
+ Blink LED when battery is below 20%: true
+ Use LED as a battery indicator: false
+ LED battery indicator brightness: 10
+ Player LED enabled: true
+ Enable Large Vibration Motor: true
+ Enable Small Vibration Motor: true
+ Switch Vibration Motors: false
+ Mouse Movement Mode: Relative
+ Mouse Deadzone X Axis: 60
+ Mouse Deadzone Y Axis: 60
+ Mouse Acceleration X Axis: 200
+ Mouse Acceleration Y Axis: 250
+ Left Stick Lerp Factor: 100
+ Right Stick Lerp Factor: 100
+ Analog Button Lerp Factor: 100
+ Trigger Lerp Factor: 100
+ Device Class Type: 0
+ Vendor ID: 1356
+ Product ID: 616
+ Buddy Device: ""
+Player 4 Input:
+ Handler: Evdev
+ Device: Microsoft X-Box 360 pad 3
+ Config:
+ Left Stick Left: LX-
+ Left Stick Down: LY+
+ Left Stick Right: LX+
+ Left Stick Up: LY-
+ Right Stick Left: RX-
+ Right Stick Down: RY+
+ Right Stick Right: RX+
+ Right Stick Up: RY-
+ Start: Start
+ Select: Select
+ PS Button: Mode
+ Square: X
+ Cross: A
+ Circle: B
+ Triangle: Y
+ Left: Hat0 X-
+ Down: Hat0 Y+
+ Right: Hat0 X+
+ Up: Hat0 Y-
+ R1: TR
+ R2: RZ+
+ R3: Thumb R
+ L1: TL
+ L2: LZ+
+ L3: Thumb L
+ Motion Sensor X:
+ Axis: X
+ Mirrored: false
+ Shift: 0
+ Motion Sensor Y:
+ Axis: Y
+ Mirrored: false
+ Shift: 0
+ Motion Sensor Z:
+ Axis: Z
+ Mirrored: false
+ Shift: 0
+ Motion Sensor G:
+ Axis: RX
Mirrored: false
Shift: 0
Pressure Intensity Button: ""
@@ -76,240 +310,6 @@ Player 1 Input:
Vendor ID: 1356
Product ID: 616
Buddy Device: ""
-Player 2 Input:
- Handler: "Null"
- Device: "Null"
- Config:
- Left Stick Left: ""
- Left Stick Down: ""
- Left Stick Right: ""
- Left Stick Up: ""
- Right Stick Left: ""
- Right Stick Down: ""
- Right Stick Right: ""
- Right Stick Up: ""
- Start: ""
- Select: ""
- PS Button: ""
- Square: ""
- Cross: ""
- Circle: ""
- Triangle: ""
- Left: ""
- Down: ""
- Right: ""
- Up: ""
- R1: ""
- R2: ""
- R3: ""
- L1: ""
- L2: ""
- L3: ""
- Motion Sensor X:
- Axis: ""
- Mirrored: false
- Shift: 0
- Motion Sensor Y:
- Axis: ""
- Mirrored: false
- Shift: 0
- Motion Sensor Z:
- Axis: ""
- Mirrored: false
- Shift: 0
- Motion Sensor G:
- Axis: ""
- Mirrored: false
- Shift: 0
- Pressure Intensity Button: ""
- Pressure Intensity Percent: 50
- Left Stick Multiplier: 100
- Right Stick Multiplier: 100
- Left Stick Deadzone: 0
- Right Stick Deadzone: 0
- Left Trigger Threshold: 0
- Right Trigger Threshold: 0
- Left Pad Squircling Factor: 0
- Right Pad Squircling Factor: 0
- Color Value R: 0
- Color Value G: 0
- Color Value B: 0
- Blink LED when battery is below 20%: true
- Use LED as a battery indicator: false
- LED battery indicator brightness: 50
- Player LED enabled: true
- Enable Large Vibration Motor: true
- Enable Small Vibration Motor: true
- Switch Vibration Motors: false
- Mouse Movement Mode: Relative
- Mouse Deadzone X Axis: 60
- Mouse Deadzone Y Axis: 60
- Mouse Acceleration X Axis: 200
- Mouse Acceleration Y Axis: 250
- Left Stick Lerp Factor: 100
- Right Stick Lerp Factor: 100
- Analog Button Lerp Factor: 100
- Trigger Lerp Factor: 100
- Device Class Type: 0
- Vendor ID: 0
- Product ID: 0
- Buddy Device: "Null"
-Player 3 Input:
- Handler: "Null"
- Device: "Null"
- Config:
- Left Stick Left: ""
- Left Stick Down: ""
- Left Stick Right: ""
- Left Stick Up: ""
- Right Stick Left: ""
- Right Stick Down: ""
- Right Stick Right: ""
- Right Stick Up: ""
- Start: ""
- Select: ""
- PS Button: ""
- Square: ""
- Cross: ""
- Circle: ""
- Triangle: ""
- Left: ""
- Down: ""
- Right: ""
- Up: ""
- R1: ""
- R2: ""
- R3: ""
- L1: ""
- L2: ""
- L3: ""
- Motion Sensor X:
- Axis: ""
- Mirrored: false
- Shift: 0
- Motion Sensor Y:
- Axis: ""
- Mirrored: false
- Shift: 0
- Motion Sensor Z:
- Axis: ""
- Mirrored: false
- Shift: 0
- Motion Sensor G:
- Axis: ""
- Mirrored: false
- Shift: 0
- Pressure Intensity Button: ""
- Pressure Intensity Percent: 50
- Left Stick Multiplier: 100
- Right Stick Multiplier: 100
- Left Stick Deadzone: 0
- Right Stick Deadzone: 0
- Left Trigger Threshold: 0
- Right Trigger Threshold: 0
- Left Pad Squircling Factor: 0
- Right Pad Squircling Factor: 0
- Color Value R: 0
- Color Value G: 0
- Color Value B: 0
- Blink LED when battery is below 20%: true
- Use LED as a battery indicator: false
- LED battery indicator brightness: 50
- Player LED enabled: true
- Enable Large Vibration Motor: true
- Enable Small Vibration Motor: true
- Switch Vibration Motors: false
- Mouse Movement Mode: Relative
- Mouse Deadzone X Axis: 60
- Mouse Deadzone Y Axis: 60
- Mouse Acceleration X Axis: 200
- Mouse Acceleration Y Axis: 250
- Left Stick Lerp Factor: 100
- Right Stick Lerp Factor: 100
- Analog Button Lerp Factor: 100
- Trigger Lerp Factor: 100
- Device Class Type: 0
- Vendor ID: 0
- Product ID: 0
- Buddy Device: "Null"
-Player 4 Input:
- Handler: "Null"
- Device: "Null"
- Config:
- Left Stick Left: ""
- Left Stick Down: ""
- Left Stick Right: ""
- Left Stick Up: ""
- Right Stick Left: ""
- Right Stick Down: ""
- Right Stick Right: ""
- Right Stick Up: ""
- Start: ""
- Select: ""
- PS Button: ""
- Square: ""
- Cross: ""
- Circle: ""
- Triangle: ""
- Left: ""
- Down: ""
- Right: ""
- Up: ""
- R1: ""
- R2: ""
- R3: ""
- L1: ""
- L2: ""
- L3: ""
- Motion Sensor X:
- Axis: ""
- Mirrored: false
- Shift: 0
- Motion Sensor Y:
- Axis: ""
- Mirrored: false
- Shift: 0
- Motion Sensor Z:
- Axis: ""
- Mirrored: false
- Shift: 0
- Motion Sensor G:
- Axis: ""
- Mirrored: false
- Shift: 0
- Pressure Intensity Button: ""
- Pressure Intensity Percent: 50
- Left Stick Multiplier: 100
- Right Stick Multiplier: 100
- Left Stick Deadzone: 0
- Right Stick Deadzone: 0
- Left Trigger Threshold: 0
- Right Trigger Threshold: 0
- Left Pad Squircling Factor: 0
- Right Pad Squircling Factor: 0
- Color Value R: 0
- Color Value G: 0
- Color Value B: 0
- Blink LED when battery is below 20%: true
- Use LED as a battery indicator: false
- LED battery indicator brightness: 50
- Player LED enabled: true
- Enable Large Vibration Motor: true
- Enable Small Vibration Motor: true
- Switch Vibration Motors: false
- Mouse Movement Mode: Relative
- Mouse Deadzone X Axis: 60
- Mouse Deadzone Y Axis: 60
- Mouse Acceleration X Axis: 200
- Mouse Acceleration Y Axis: 250
- Left Stick Lerp Factor: 100
- Right Stick Lerp Factor: 100
- Analog Button Lerp Factor: 100
- Trigger Lerp Factor: 100
- Device Class Type: 0
- Vendor ID: 0
- Product ID: 0
- Buddy Device: "Null"
Player 5 Input:
Handler: "Null"
Device: "Null"
@@ -385,9 +385,9 @@ Player 5 Input:
Analog Button Lerp Factor: 100
Trigger Lerp Factor: 100
Device Class Type: 0
- Vendor ID: 0
- Product ID: 0
- Buddy Device: "Null"
+ Vendor ID: 1356
+ Product ID: 616
+ Buddy Device: ""
Player 6 Input:
Handler: "Null"
Device: "Null"
@@ -465,7 +465,7 @@ Player 6 Input:
Device Class Type: 0
Vendor ID: 0
Product ID: 0
- Buddy Device: "Null"
+ Buddy Device: ""
Player 7 Input:
Handler: "Null"
Device: "Null"
@@ -543,4 +543,4 @@ Player 7 Input:
Device Class Type: 0
Vendor ID: 0
Product ID: 0
- Buddy Device: "Null"
\ No newline at end of file
+ Buddy Device: ""
diff --git a/emu-configs/ryujinx/Config.json b/emu-configs/ryujinx/Config.json
index e58b6ead..f08820fa 100644
--- a/emu-configs/ryujinx/Config.json
+++ b/emu-configs/ryujinx/Config.json
@@ -1,5 +1,5 @@
{
- "version": 48,
+ "version": 49,
"enable_file_log": true,
"backend_threading": "Auto",
"res_scale": 1,
@@ -12,7 +12,7 @@
"graphics_shaders_dump_path": "",
"logging_enable_debug": false,
"logging_enable_stub": false,
- "logging_enable_info": true,
+ "logging_enable_info": false,
"logging_enable_warn": true,
"logging_enable_error": true,
"logging_enable_trace": false,
@@ -28,7 +28,7 @@
"enable_discord_integration": true,
"check_updates_on_start": false,
"show_confirm_exit": false,
- "hide_cursor": 2,
+ "hide_cursor": 1,
"enable_vsync": true,
"enable_shader_cache": true,
"enable_texture_recompression": false,
@@ -38,7 +38,7 @@
"enable_internet_access": false,
"enable_fs_integrity_checks": true,
"fs_global_access_log_mode": 0,
- "audio_backend": "OpenAl",
+ "audio_backend": "SDL2",
"audio_volume": 1,
"memory_manager_mode": "HostMappedUnsafe",
"expand_ram": false,
@@ -72,10 +72,10 @@
},
"window_startup": {
"window_size_width": 1280,
- "window_size_height": 800,
+ "window_size_height": 760,
"window_position_x": 0,
"window_position_y": 0,
- "window_maximized": true
+ "window_maximized": false
},
"language_code": "en_US",
"enable_custom_theme": false,
@@ -91,7 +91,7 @@
"enable_keyboard": false,
"enable_mouse": false,
"hotkeys": {
- "toggle_vsync": "F1",
+ "toggle_vsync": "Tab",
"screenshot": "F8",
"show_ui": "F4",
"pause": "F5",
@@ -119,13 +119,18 @@
"rotate90_cw": false,
"stick_button": "RightStick"
},
- "deadzone_left": 0,
- "deadzone_right": 0,
+ "deadzone_left": 0.1,
+ "deadzone_right": 0.1,
"range_left": 1,
"range_right": 1,
"trigger_threshold": 0.5,
"motion": {
- "motion_backend": "GamepadDriver",
+ "slot": 0,
+ "alt_slot": 0,
+ "mirror_input": false,
+ "dsu_server_host": "127.0.0.1",
+ "dsu_server_port": 26760,
+ "motion_backend": "CemuHook",
"sensitivity": 100,
"gyro_deadzone": 1,
"enable_motion": true
@@ -136,7 +141,7 @@
"enable_rumble": true
},
"left_joycon": {
- "button_minus": "Minus",
+ "button_minus": "Back",
"button_l": "LeftShoulder",
"button_zl": "LeftTrigger",
"button_sl": "Unbound",
@@ -147,7 +152,7 @@
"dpad_right": "DpadRight"
},
"right_joycon": {
- "button_plus": "Plus",
+ "button_plus": "Start",
"button_r": "RightShoulder",
"button_zr": "RightTrigger",
"button_sl": "Unbound",
@@ -160,12 +165,13 @@
"version": 1,
"backend": "GamepadSDL2",
"id": "0-f6790003-28de-0000-ff11-000001000000",
- "controller_type": "Handheld",
- "player_index": "Handheld"
- }
+ "controller_type": "ProController",
+ "player_index": "Player1"
+ },
],
"graphics_backend": "Vulkan",
"preferred_gpu": "0x1002_0x163F",
+ "multiplayer_mode": 0,
"multiplayer_lan_interface_id": "0",
"use_hypervisor": true
}
diff --git a/emu-configs/ryujinx/profiles/controller/Steam Deck - Neptune.json b/emu-configs/ryujinx/profiles/controller/Steam Deck - Neptune.json
new file mode 100644
index 00000000..9e698271
--- /dev/null
+++ b/emu-configs/ryujinx/profiles/controller/Steam Deck - Neptune.json
@@ -0,0 +1,64 @@
+{
+ "left_joycon_stick": {
+ "joystick": "Left",
+ "invert_stick_x": false,
+ "invert_stick_y": false,
+ "rotate90_cw": false,
+ "stick_button": "LeftStick"
+ },
+ "right_joycon_stick": {
+ "joystick": "Right",
+ "invert_stick_x": false,
+ "invert_stick_y": false,
+ "rotate90_cw": false,
+ "stick_button": "RightStick"
+ },
+ "deadzone_left": 0.1,
+ "deadzone_right": 0.1,
+ "range_left": 1,
+ "range_right": 1,
+ "trigger_threshold": 0.5,
+ "motion": {
+ "slot": 0,
+ "alt_slot": 0,
+ "mirror_input": false,
+ "dsu_server_host": "172.0.0.1",
+ "dsu_server_port": 26760,
+ "motion_backend": "CemuHook",
+ "sensitivity": 100,
+ "gyro_deadzone": 1,
+ "enable_motion": true
+ },
+ "rumble": {
+ "strong_rumble": 1,
+ "weak_rumble": 1,
+ "enable_rumble": true
+ },
+ "left_joycon": {
+ "button_minus": "Back",
+ "button_l": "LeftShoulder",
+ "button_zl": "LeftTrigger",
+ "button_sl": "Unbound",
+ "button_sr": "Unbound",
+ "dpad_up": "DpadUp",
+ "dpad_down": "DpadDown",
+ "dpad_left": "DpadLeft",
+ "dpad_right": "DpadRight"
+ },
+ "right_joycon": {
+ "button_plus": "Start",
+ "button_r": "RightShoulder",
+ "button_zr": "RightTrigger",
+ "button_sl": "Unbound",
+ "button_sr": "Unbound",
+ "button_x": "Y",
+ "button_b": "A",
+ "button_y": "X",
+ "button_a": "B"
+ },
+ "version": 1,
+ "backend": "GamepadSDL2",
+ "id": "0-f6790003-28de-0000-ff11-000001000000",
+ "controller_type": "ProController",
+ "player_index": "Player1"
+}
diff --git a/emu-configs/ryujinx/profiles/controller/Steam Virtual Controller.json b/emu-configs/ryujinx/profiles/controller/Steam Virtual Controller.json
new file mode 100644
index 00000000..30326c5e
--- /dev/null
+++ b/emu-configs/ryujinx/profiles/controller/Steam Virtual Controller.json
@@ -0,0 +1,64 @@
+{
+ "left_joycon_stick": {
+ "joystick": "Left",
+ "invert_stick_x": false,
+ "invert_stick_y": false,
+ "rotate90_cw": false,
+ "stick_button": "LeftStick"
+ },
+ "right_joycon_stick": {
+ "joystick": "Right",
+ "invert_stick_x": false,
+ "invert_stick_y": false,
+ "rotate90_cw": false,
+ "stick_button": "RightStick"
+ },
+ "deadzone_left": 0.1,
+ "deadzone_right": 0.1,
+ "range_left": 1,
+ "range_right": 1,
+ "trigger_threshold": 0.5,
+ "motion": {
+ "slot": 0,
+ "alt_slot": 0,
+ "mirror_input": false,
+ "dsu_server_host": "172.0.0.1",
+ "dsu_server_port": 26760,
+ "motion_backend": "CemuHook",
+ "sensitivity": 100,
+ "gyro_deadzone": 1,
+ "enable_motion": false
+ },
+ "rumble": {
+ "strong_rumble": 1,
+ "weak_rumble": 1,
+ "enable_rumble": true
+ },
+ "left_joycon": {
+ "button_minus": "Back",
+ "button_l": "LeftShoulder",
+ "button_zl": "LeftTrigger",
+ "button_sl": "Unbound",
+ "button_sr": "Unbound",
+ "dpad_up": "DpadUp",
+ "dpad_down": "DpadDown",
+ "dpad_left": "DpadLeft",
+ "dpad_right": "DpadRight"
+ },
+ "right_joycon": {
+ "button_plus": "Start",
+ "button_r": "RightShoulder",
+ "button_zr": "RightTrigger",
+ "button_sl": "Unbound",
+ "button_sr": "Unbound",
+ "button_x": "Y",
+ "button_b": "A",
+ "button_y": "X",
+ "button_a": "B"
+ },
+ "version": 1,
+ "backend": "GamepadSDL2",
+ "id": "0-f7390003-28de-0000-ff11-000001000000",
+ "controller_type": "ProController",
+ "player_index": "Player1"
+}
diff --git a/emu-configs/yuzu/qt-config.ini b/emu-configs/yuzu/qt-config.ini
index a1e63a4d..8fbb3621 100644
--- a/emu-configs/yuzu/qt-config.ini
+++ b/emu-configs/yuzu/qt-config.ini
@@ -81,7 +81,7 @@ motion_enabled=true
motion_enabled\default=true
mouse_enabled=false
mouse_enabled\default=true
-mouse_panning_sensitivity=50
+mouse_panning_sensitivity=10
mouse_panning_sensitivity\default=true
pause_tas_on_load=true
pause_tas_on_load\default=true
@@ -89,59 +89,59 @@ player_0_body_color_left=4278893030
player_0_body_color_left\default=false
player_0_body_color_right=4294917160
player_0_body_color_right\default=false
-player_0_button_a="pad:0,button:1,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_a="button:1,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_a\default=false
-player_0_button_b="pad:0,button:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_b="button:0,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_b\default=false
player_0_button_color_left=4278197790
player_0_button_color_left\default=false
player_0_button_color_right=4280158730
player_0_button_color_right\default=false
-player_0_button_ddown="hat:0,pad:0,direction:down,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_ddown\default=false
-player_0_button_dleft="hat:0,pad:0,direction:left,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_dleft\default=false
-player_0_button_dright="hat:0,pad:0,direction:right,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_dright\default=false
-player_0_button_dup="hat:0,pad:0,direction:up,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_dup\default=false
-player_0_button_home="engine:keyboard,port:0,pad:0,code:76"
+player_0_button_home="button:8,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_home\default=false
-player_0_button_l="pad:0,button:4,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_l="button:4,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_l\default=false
-player_0_button_lstick="pad:0,button:9,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_lstick\default=false
-player_0_button_minus="pad:0,button:6,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_minus="button:6,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_minus\default=false
-player_0_button_plus="pad:0,button:7,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_plus="button:7,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_plus\default=false
-player_0_button_r="pad:0,button:5,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_r="button:5,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_r\default=false
-player_0_button_rstick="pad:0,button:10,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_rstick\default=false
-player_0_button_screenshot="engine:keyboard,port:0,pad:0,code:82"
+player_0_button_screenshot=[empty]
player_0_button_screenshot\default=false
-player_0_button_sl="toggle:0,code:81,engine:keyboard"
-player_0_button_sl\default=true
-player_0_button_sr="toggle:0,code:69,engine:keyboard"
-player_0_button_sr\default=true
-player_0_button_x="pad:0,button:3,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_sl="button:4,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_sl\default=false
+player_0_button_sr="button:5,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
+player_0_button_sr\default=false
+player_0_button_x="button:3,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_x\default=false
-player_0_button_y="pad:0,button:2,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_y="button:2,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_button_y\default=false
-player_0_button_zl="threshold:0.500000,axis:2,pad:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:0,invert:+,engine:sdl"
player_0_button_zl\default=false
-player_0_button_zr="threshold:0.500000,axis:5,pad:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:0,invert:+,engine:sdl"
player_0_button_zr\default=false
player_0_connected=true
player_0_connected\default=true
-player_0_lstick="range:0.950000,deadzone:0.150000,threshold:0.500000,axis_y:1,axis_x:0,pad:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_lstick\default=false
-player_0_motionleft="toggle:0,code:55,engine:keyboard"
-player_0_motionleft\default=true
-player_0_motionright="toggle:0,code:56,engine:keyboard"
-player_0_motionright\default=true
-player_0_rstick="range:0.950000,deadzone:0.150000,threshold:0.500000,axis_y:4,axis_x:3,pad:0,port:0,guid:03000000de280000ff11000001000000,engine:sdl"
+player_0_motionleft="motion:0,pad:0,port:26760,guid:0000000000000000000000007f000001,engine:cemuhookudp"
+player_0_motionleft\default=false
+player_0_motionright=[empty]
+player_0_motionright\default=false
+player_0_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:0,engine:sdl"
player_0_rstick\default=false
player_0_type=0
player_0_type\default=true
@@ -153,60 +153,60 @@ player_1_body_color_left=4278893030
player_1_body_color_left\default=false
player_1_body_color_right=4294917160
player_1_body_color_right\default=false
-player_1_button_a="toggle:0,code:67,engine:keyboard"
-player_1_button_a\default=true
-player_1_button_b="toggle:0,code:88,engine:keyboard"
-player_1_button_b\default=true
+player_1_button_a="button:1,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_a\default=false
+player_1_button_b="button:0,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_b\default=false
player_1_button_color_left=4278197790
player_1_button_color_left\default=false
player_1_button_color_right=4280158730
player_1_button_color_right\default=false
-player_1_button_ddown="toggle:0,code:16777237,engine:keyboard"
-player_1_button_ddown\default=true
-player_1_button_dleft="toggle:0,code:16777234,engine:keyboard"
-player_1_button_dleft\default=true
-player_1_button_dright="toggle:0,code:16777236,engine:keyboard"
-player_1_button_dright\default=true
-player_1_button_dup="toggle:0,code:16777235,engine:keyboard"
-player_1_button_dup\default=true
-player_1_button_home="toggle:0,code:0,engine:keyboard"
-player_1_button_home\default=true
-player_1_button_l="toggle:0,code:81,engine:keyboard"
-player_1_button_l\default=true
-player_1_button_lstick="toggle:0,code:70,engine:keyboard"
-player_1_button_lstick\default=true
-player_1_button_minus="toggle:0,code:78,engine:keyboard"
-player_1_button_minus\default=true
-player_1_button_plus="toggle:0,code:77,engine:keyboard"
-player_1_button_plus\default=true
-player_1_button_r="toggle:0,code:69,engine:keyboard"
-player_1_button_r\default=true
-player_1_button_rstick="toggle:0,code:71,engine:keyboard"
-player_1_button_rstick\default=true
-player_1_button_screenshot="toggle:0,code:0,engine:keyboard"
-player_1_button_screenshot\default=true
-player_1_button_sl="toggle:0,code:81,engine:keyboard"
-player_1_button_sl\default=true
-player_1_button_sr="toggle:0,code:69,engine:keyboard"
-player_1_button_sr\default=true
-player_1_button_x="toggle:0,code:86,engine:keyboard"
-player_1_button_x\default=true
-player_1_button_y="toggle:0,code:90,engine:keyboard"
-player_1_button_y\default=true
-player_1_button_zl="toggle:0,code:82,engine:keyboard"
-player_1_button_zl\default=true
-player_1_button_zr="toggle:0,code:84,engine:keyboard"
-player_1_button_zr\default=true
-player_1_connected=false
-player_1_connected\default=true
-player_1_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button"
-player_1_lstick\default=true
-player_1_motionleft="toggle:0,code:55,engine:keyboard"
-player_1_motionleft\default=true
-player_1_motionright="toggle:0,code:56,engine:keyboard"
-player_1_motionright\default=true
-player_1_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button"
-player_1_rstick\default=true
+player_1_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_ddown\default=false
+player_1_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_dleft\default=false
+player_1_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_dright\default=false
+player_1_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_dup\default=false
+player_1_button_home="button:8,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_home\default=false
+player_1_button_l="button:4,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_l\default=false
+player_1_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_lstick\default=false
+player_1_button_minus="button:6,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_minus\default=false
+player_1_button_plus="button:7,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_plus\default=false
+player_1_button_r="button:5,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_r\default=false
+player_1_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_rstick\default=false
+player_1_button_screenshot=[empty]
+player_1_button_screenshot\default=false
+player_1_button_sl="button:4,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_sl\default=false
+player_1_button_sr="button:5,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_sr\default=false
+player_1_button_x="button:3,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_x\default=false
+player_1_button_y="button:2,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_button_y\default=false
+player_1_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:1,invert:+,engine:sdl"
+player_1_button_zl\default=false
+player_1_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:1,invert:+,engine:sdl"
+player_1_button_zr\default=false
+player_1_connected=true
+player_1_connected\default=false
+player_1_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_lstick\default=false
+player_1_motionleft=[empty]
+player_1_motionleft\default=false
+player_1_motionright=[empty]
+player_1_motionright\default=false
+player_1_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:1,engine:sdl"
+player_1_rstick\default=false
player_1_type=0
player_1_type\default=true
player_1_vibration_enabled=true
@@ -217,60 +217,60 @@ player_2_body_color_left=4278893030
player_2_body_color_left\default=false
player_2_body_color_right=4294917160
player_2_body_color_right\default=false
-player_2_button_a="toggle:0,code:67,engine:keyboard"
-player_2_button_a\default=true
-player_2_button_b="toggle:0,code:88,engine:keyboard"
-player_2_button_b\default=true
+player_2_button_a="button:1,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_a\default=false
+player_2_button_b="button:0,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_b\default=false
player_2_button_color_left=4278197790
player_2_button_color_left\default=false
player_2_button_color_right=4280158730
player_2_button_color_right\default=false
-player_2_button_ddown="toggle:0,code:16777237,engine:keyboard"
-player_2_button_ddown\default=true
-player_2_button_dleft="toggle:0,code:16777234,engine:keyboard"
-player_2_button_dleft\default=true
-player_2_button_dright="toggle:0,code:16777236,engine:keyboard"
-player_2_button_dright\default=true
-player_2_button_dup="toggle:0,code:16777235,engine:keyboard"
-player_2_button_dup\default=true
-player_2_button_home="toggle:0,code:0,engine:keyboard"
-player_2_button_home\default=true
-player_2_button_l="toggle:0,code:81,engine:keyboard"
-player_2_button_l\default=true
-player_2_button_lstick="toggle:0,code:70,engine:keyboard"
-player_2_button_lstick\default=true
-player_2_button_minus="toggle:0,code:78,engine:keyboard"
-player_2_button_minus\default=true
-player_2_button_plus="toggle:0,code:77,engine:keyboard"
-player_2_button_plus\default=true
-player_2_button_r="toggle:0,code:69,engine:keyboard"
-player_2_button_r\default=true
-player_2_button_rstick="toggle:0,code:71,engine:keyboard"
-player_2_button_rstick\default=true
-player_2_button_screenshot="toggle:0,code:0,engine:keyboard"
-player_2_button_screenshot\default=true
-player_2_button_sl="toggle:0,code:81,engine:keyboard"
-player_2_button_sl\default=true
-player_2_button_sr="toggle:0,code:69,engine:keyboard"
-player_2_button_sr\default=true
-player_2_button_x="toggle:0,code:86,engine:keyboard"
-player_2_button_x\default=true
-player_2_button_y="toggle:0,code:90,engine:keyboard"
-player_2_button_y\default=true
-player_2_button_zl="toggle:0,code:82,engine:keyboard"
-player_2_button_zl\default=true
-player_2_button_zr="toggle:0,code:84,engine:keyboard"
-player_2_button_zr\default=true
-player_2_connected=false
-player_2_connected\default=true
-player_2_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button"
-player_2_lstick\default=true
-player_2_motionleft="toggle:0,code:55,engine:keyboard"
-player_2_motionleft\default=true
-player_2_motionright="toggle:0,code:56,engine:keyboard"
-player_2_motionright\default=true
-player_2_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button"
-player_2_rstick\default=true
+player_2_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_ddown\default=false
+player_2_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_dleft\default=false
+player_2_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_dright\default=false
+player_2_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_dup\default=false
+player_2_button_home="button:8,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_home\default=false
+player_2_button_l="button:4,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_l\default=false
+player_2_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_lstick\default=false
+player_2_button_minus="button:6,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_minus\default=false
+player_2_button_plus="button:7,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_plus\default=false
+player_2_button_r="button:5,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_r\default=false
+player_2_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_rstick\default=false
+player_2_button_screenshot=[empty]
+player_2_button_screenshot\default=false
+player_2_button_sl="button:4,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_sl\default=false
+player_2_button_sr="button:5,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_sr\default=false
+player_2_button_x="button:3,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_x\default=false
+player_2_button_y="button:2,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_button_y\default=false
+player_2_button_zl="threshold:0.500000,axis:2,guid:03000000de280000ff11000001000000,port:2,invert:+,engine:sdl"
+player_2_button_zl\default=false
+player_2_button_zr="threshold:0.500000,axis:5,guid:03000000de280000ff11000001000000,port:2,invert:+,engine:sdl"
+player_2_button_zr\default=false
+player_2_connected=true
+player_2_connected\default=false
+player_2_lstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_lstick\default=false
+player_2_motionleft=[empty]
+player_2_motionleft\default=false
+player_2_motionright=[empty]
+player_2_motionright\default=false
+player_2_rstick="deadzone:0.150000,invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:2,engine:sdl"
+player_2_rstick\default=false
player_2_type=0
player_2_type\default=true
player_2_vibration_enabled=true
@@ -281,60 +281,60 @@ player_3_body_color_left=4278893030
player_3_body_color_left\default=false
player_3_body_color_right=4294917160
player_3_body_color_right\default=false
-player_3_button_a="toggle:0,code:67,engine:keyboard"
-player_3_button_a\default=true
-player_3_button_b="toggle:0,code:88,engine:keyboard"
-player_3_button_b\default=true
+player_3_button_a="button:1,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_a\default=false
+player_3_button_b="button:0,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_b\default=false
player_3_button_color_left=4278197790
player_3_button_color_left\default=false
player_3_button_color_right=4280158730
player_3_button_color_right\default=false
-player_3_button_ddown="toggle:0,code:16777237,engine:keyboard"
-player_3_button_ddown\default=true
-player_3_button_dleft="toggle:0,code:16777234,engine:keyboard"
-player_3_button_dleft\default=true
-player_3_button_dright="toggle:0,code:16777236,engine:keyboard"
-player_3_button_dright\default=true
-player_3_button_dup="toggle:0,code:16777235,engine:keyboard"
-player_3_button_dup\default=true
-player_3_button_home="toggle:0,code:0,engine:keyboard"
-player_3_button_home\default=true
-player_3_button_l="toggle:0,code:81,engine:keyboard"
-player_3_button_l\default=true
-player_3_button_lstick="toggle:0,code:70,engine:keyboard"
-player_3_button_lstick\default=true
-player_3_button_minus="toggle:0,code:78,engine:keyboard"
-player_3_button_minus\default=true
-player_3_button_plus="toggle:0,code:77,engine:keyboard"
-player_3_button_plus\default=true
-player_3_button_r="toggle:0,code:69,engine:keyboard"
-player_3_button_r\default=true
-player_3_button_rstick="toggle:0,code:71,engine:keyboard"
-player_3_button_rstick\default=true
-player_3_button_screenshot="toggle:0,code:0,engine:keyboard"
-player_3_button_screenshot\default=true
-player_3_button_sl="toggle:0,code:81,engine:keyboard"
-player_3_button_sl\default=true
-player_3_button_sr="toggle:0,code:69,engine:keyboard"
-player_3_button_sr\default=true
-player_3_button_x="toggle:0,code:86,engine:keyboard"
-player_3_button_x\default=true
-player_3_button_y="toggle:0,code:90,engine:keyboard"
-player_3_button_y\default=true
-player_3_button_zl="toggle:0,code:82,engine:keyboard"
-player_3_button_zl\default=true
-player_3_button_zr="toggle:0,code:84,engine:keyboard"
-player_3_button_zr\default=true
-player_3_connected=false
-player_3_connected\default=true
-player_3_lstick="modifier_scale:0.500000,modifier:toggle$00$1code$016777248$1engine$0keyboard,right:toggle$00$1code$068$1engine$0keyboard,left:toggle$00$1code$065$1engine$0keyboard,down:toggle$00$1code$083$1engine$0keyboard,up:toggle$00$1code$087$1engine$0keyboard,engine:analog_from_button"
-player_3_lstick\default=true
-player_3_motionleft="toggle:0,code:55,engine:keyboard"
-player_3_motionleft\default=true
-player_3_motionright="toggle:0,code:56,engine:keyboard"
-player_3_motionright\default=true
-player_3_rstick="modifier_scale:0.500000,modifier:toggle$00$1code$00$1engine$0keyboard,right:toggle$00$1code$076$1engine$0keyboard,left:toggle$00$1code$074$1engine$0keyboard,down:toggle$00$1code$075$1engine$0keyboard,up:toggle$00$1code$073$1engine$0keyboard,engine:analog_from_button"
-player_3_rstick\default=true
+player_3_button_ddown="hat:0,direction:down,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_ddown\default=false
+player_3_button_dleft="hat:0,direction:left,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_dleft\default=false
+player_3_button_dright="hat:0,direction:right,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_dright\default=false
+player_3_button_dup="hat:0,direction:up,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_dup\default=false
+player_3_button_home="button:8,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_home\default=false
+player_3_button_l="button:4,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_l\default=false
+player_3_button_lstick="button:9,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_lstick\default=false
+player_3_button_minus="button:6,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_minus\default=false
+player_3_button_plus="button:7,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_plus\default=false
+player_3_button_r="button:5,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_r\default=false
+player_3_button_rstick="button:10,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_rstick\default=false
+player_3_button_screenshot=[empty]
+player_3_button_screenshot\default=false
+player_3_button_sl="button:4,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_sl\default=false
+player_3_button_sr="button:5,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_sr\default=false
+player_3_button_x="button:3,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_x\default=false
+player_3_button_y="button:2,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_button_y\default=false
+player_3_button_zl="threshold:0.5,axis:2,guid:03000000de280000ff11000001000000,port:3,invert:+,engine:sdl"
+player_3_button_zl\default=false
+player_3_button_zr="threshold:0.5,axis:5,guid:03000000de280000ff11000001000000,port:3,invert:+,engine:sdl"
+player_3_button_zr\default=false
+player_3_connected=true
+player_3_connected\default=false
+player_3_lstick="invert_y:+,invert_x:+,offset_y:0.000000,axis_y:1,offset_x:-0.000000,axis_x:0,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_lstick\default=false
+player_3_motionleft=[empty]
+player_3_motionleft\default=false
+player_3_motionright=[empty]
+player_3_motionright\default=false
+player_3_rstick="invert_y:+,invert_x:+,offset_y:0.000000,axis_y:4,offset_x:-0.000000,axis_x:3,guid:03000000de280000ff11000001000000,port:3,engine:sdl"
+player_3_rstick\default=false
player_3_type=0
player_3_type\default=true
player_3_vibration_enabled=true
@@ -749,8 +749,8 @@ touchscreen_enabled=true
touchscreen_enabled\default=true
udp_input_servers=127.0.0.1:26760
udp_input_servers\default=true
-use_docked_mode=true
-use_docked_mode\default=true
+use_docked_mode=false
+use_docked_mode\default=false
vibration_enabled=true
vibration_enabled\default=true
@@ -815,9 +815,9 @@ gamecard_path=
gamecard_path\default=true
load_directory=/var/data/yuzu/load
load_directory\default=true
-nand_directory=RETRODECKHOMEDIR/saves/switch/yuzu/nand
+nand_directory=RETRODECKHOMEDIR/saves/switch/nand
nand_directory\default=true
-sdmc_directory=RETRODECKHOMEDIR/saves/switch/yuzu/sdmc
+sdmc_directory=RETRODECKHOMEDIR/saves/switch/sdmc
sdmc_directory\default=true
tas_directory=/var/data/yuzu/tas
tas_directory\default=true
@@ -865,6 +865,30 @@ log_filter\default=true
use_dev_keys=false
use_dev_keys\default=true
+[Multiplayer]
+game_id=0
+game_id\default=true
+host_type=0
+host_type\default=true
+ip=
+ip\default=true
+ip_ban_list\size=0
+max_player=8
+max_player\default=true
+nickname=
+nickname\default=true
+port=24872
+port\default=true
+room_description=
+room_description\default=true
+room_name=
+room_name\default=true
+room_nickname=RetroDECK
+room_nickname\default=true
+room_port=24872
+room_port\default=true
+username_ban_list\size=0
+
[Renderer]
accelerate_astc=true
accelerate_astc\default=true
@@ -893,17 +917,17 @@ fsr_sharpening_slider\default=true
fullscreen_mode=1
fullscreen_mode\default=true
gpu_accuracy=0
-gpu_accuracy\default=true
-max_anisotropy=0
-max_anisotropy\default=true
+gpu_accuracy\default=false
+max_anisotropy=1
+max_anisotropy\default=false
nsight_aftermath=false
nsight_aftermath\default=true
nvdec_emulation=2
nvdec_emulation\default=true
resolution_setup=2
resolution_setup\default=true
-scaling_filter=1
-scaling_filter\default=true
+scaling_filter=5
+scaling_filter\default=false
shader_backend=0
shader_backend\default=true
shader_feedback=false
@@ -912,8 +936,8 @@ speed_limit=100
speed_limit\default=true
use_asynchronous_gpu_emulation=true
use_asynchronous_gpu_emulation\default=true
-use_asynchronous_shaders=false
-use_asynchronous_shaders\default=true
+use_asynchronous_shaders=true
+use_asynchronous_shaders\default=false
use_disk_shader_cache=true
use_disk_shader_cache\default=true
use_fast_gpu_time=true
@@ -1245,9 +1269,9 @@ theme\default=false
[WebService]
enable_telemetry=false
enable_telemetry\default=false
-web_api_url=https://api.yuzu-emu.org
+web_api_url=
web_api_url\default=true
yuzu_token=
yuzu_token\default=true
yuzu_username=RetroDECK
-yuzu_username\default=true
\ No newline at end of file
+yuzu_username\default=true
diff --git a/es-configs/es_find_rules.xml b/es-configs/es_find_rules.xml
deleted file mode 100644
index 112a4a40..00000000
--- a/es-configs/es_find_rules.xml
+++ /dev/null
@@ -1,1085 +0,0 @@
-
-
-
-
-
-
- bash
- sh
-
-
-
-
- retroarch
- org.libretro.RetroArch
-
-
- ~/Applications/RetroArch-Linux*.AppImage
- ~/.local/share/applications/RetroArch-Linux*.AppImage
- ~/.local/bin/RetroArch-Linux*.AppImage
- ~/bin/RetroArch-Linux*.AppImage
- /var/lib/flatpak/exports/bin/org.libretro.RetroArch
- ~/.local/share/flatpak/exports/bin/org.libretro.RetroArch
-
-
-
-
- /app/share/libretro/cores
-
- ~/.config/retroarch/cores
-
- ~/Applications/RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores
- ~/.local/share/applications/RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores
- ~/.local/bin/RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores
- ~/bin/RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores
-
- ~/.var/app/org.libretro.RetroArch/config/retroarch/cores
-
- ~/snap/retroarch/current/.config/retroarch/cores
-
- /usr/lib/x86_64-linux-gnu/libretro
-
- /usr/lib64/libretro
-
- /usr/lib/libretro
-
-
-
-
-
- ~/Applications/3dSen/3dSen.exe
- ~/.local/share/applications/3dSen/3dSen.exe
- ~/.local/bin/3dSen/3dSen.exe
- ~/bin/3dSen/3dSen.exe
-
-
-
-
-
- advmame
-
-
- ~/Applications/advancemame/advmame
- ~/.local/share/applications/advancemame/advmame
- ~/.local/bin/advancemame/advmame
- ~/bin/advancemame/advmame
-
-
-
-
-
- amiberry
-
-
- ~/Applications/amiberry/amiberry
- ~/.local/share/applications/amiberry/amiberry
- ~/.local/bin/amiberry/amiberry
- ~/bin/amiberry/amiberry
-
-
-
-
-
- ares
- dev.ares.ares
-
-
- /var/lib/flatpak/exports/bin/dev.ares.ares
- ~/.local/share/flatpak/exports/bin/dev.ares.ares
-
-
-
-
-
- atari800
- atari800-jz.atari800
-
-
-
-
-
- BasiliskII
- net.cebix.basilisk
-
-
- ~/Applications/BasiliskII*.AppImage
- ~/.local/share/applications/BasiliskII*.AppImage
- ~/.local/bin/BasiliskII*.AppImage
- ~/bin/BasiliskII*.AppImage
- /var/lib/flatpak/exports/bin/net.cebix.basilisk
- ~/.local/share/flatpak/exports/bin/net.cebix.basilisk
-
-
-
-
-
- ~/Applications/BigPEmu/BigPEmu.exe
- ~/.local/share/applications/BigPEmu/BigPEmu.exe
- ~/.local/bin/BigPEmu/BigPEmu.exe
- ~/bin/BigPEmu/BigPEmu.exe
-
-
-
-
-
- blastem
- com.retrodev.blastem
-
-
- /var/lib/flatpak/exports/bin/com.retrodev.blastem
- ~/.local/share/flatpak/exports/bin/com.retrodev.blastem
-
-
-
-
-
- bsnes
- dev.bsnes.bsnes
-
-
- /var/lib/flatpak/exports/bin/dev.bsnes.bsnes
- ~/.local/share/flatpak/exports/bin/dev.bsnes.bsnes
-
-
-
-
-
- Cemu-wrapper
- cemu
- Cemu
-
-
- ~/Applications/Cemu*.AppImage
- ~/.local/share/applications/Cemu*.AppImage
- ~/.local/bin/Cemu*.AppImage
- ~/bin/Cemu*.AppImage
- ~/Applications/Cemu/Cemu
- ~/.local/share/applications/Cemu/Cemu
- ~/.local/bin/Cemu/Cemu
- ~/bin/Cemu/Cemu
- /var/lib/flatpak/exports/bin/info.cemu.Cemu
- ~/.local/share/flatpak/exports/bin/info.cemu.Cemu
-
-
-
-
-
- citra-qt
- citra
- citra-emu.citra-nightly
- org.citra_emu.citra
-
-
- ~/Applications/citra-qt*.AppImage
- ~/.local/share/applications/citra-qt*.AppImage
- ~/.local/bin/citra-qt*.AppImage
- ~/bin/citra-qt*.AppImage
- ~/.citra/canary/citra-qt.AppImage
- ~/.citra/nightly/citra-qt.AppImage
- /var/lib/flatpak/exports/bin/org.citra_emu.citra
- ~/.local/share/flatpak/exports/bin/org.citra_emu.citra
-
-
-
-
-
- cpcemu
-
-
- ~/Applications/cpcemu/cpcemu
- ~/.local/share/applications/cpcemu/cpcemu
- ~/.local/bin/cpcemu/cpcemu
- ~/bin/cpcemu/cpcemu
-
-
-
-
-
- ~/Applications/CSpect/CSpect.exe
- ~/.local/share/applications/CSpect/CSpect.exe
- ~/.local/bin/CSpect/CSpect.exe
- ~/bin/CSpect/CSpect.exe
-
-
-
-
-
- desmume
- org.desmume.DeSmuME
-
-
- /var/lib/flatpak/exports/bin/org.desmume.DeSmuME
- ~/.local/share/flatpak/exports/bin/org.desmume.DeSmuME
-
-
-
-
-
- dolphin-emu
- dolphin-emulator.dolphin-emu
- org.DolphinEmu.dolphin-emu
-
-
- ~/Applications/Dolphin_Emulator*.AppImage
- ~/.local/share/applications/Dolphin_Emulator*.AppImage
- ~/.local/bin/Dolphin_Emulator*.AppImage
- ~/bin/Dolphin_Emulator*.AppImage
- /var/lib/flatpak/exports/bin/org.DolphinEmu.dolphin-emu
- ~/.local/share/flatpak/exports/bin/org.DolphinEmu.dolphin-emu
-
-
-
-
-
- dosbox-staging
- io.github.dosbox-staging
-
-
- /var/lib/flatpak/exports/bin/io.github.dosbox-staging
- ~/.local/share/flatpak/exports/bin/io.github.dosbox-staging
-
-
-
-
-
- dosbox-x
- com.dosbox_x.DOSBox-X
-
-
- /var/lib/flatpak/exports/bin/com.dosbox_x.DOSBox-X
- ~/.local/share/flatpak/exports/bin/com.dosbox_x.DOSBox-X
-
-
-
-
-
- duckstation-nogui
- duckstation-qt
- org.duckstation.DuckStation
-
-
- ~/Applications/DuckStation*.AppImage
- ~/.local/share/applications/DuckStation*.AppImage
- ~/.local/bin/DuckStation*.AppImage
- ~/bin/DuckStation*.AppImage
- ~/Applications/duckstation-nogui*.AppImage
- ~/.local/share/applications/duckstation-nogui*.AppImage
- ~/.local/bin/duckstation-nogui*.AppImage
- ~/bin/duckstation-nogui*.AppImage
- ~/Applications/duckstation-qt*.AppImage
- ~/.local/share/applications/duckstation-qt*.AppImage
- ~/.local/bin/duckstation-qt*.AppImage
- ~/bin/duckstation-qt*.AppImage
- /var/lib/flatpak/exports/bin/org.duckstation.DuckStation
- ~/.local/share/flatpak/exports/bin/org.duckstation.DuckStation
-
-
-
-
-
- easyrpg-player
-
-
- ~/Applications/easyrpg/easyrpg-player
- ~/.local/share/applications/easyrpg/easyrpg-player
- ~/.local/bin/easyrpg/easyrpg-player
- ~/bin/easyrpg/easyrpg-player
-
-
-
-
-
- eka2l1_qt
-
-
- ~/Applications/EKA2L1*.AppImage
- ~/.local/share/applications/EKA2L1*.AppImage
- ~/.local/bin/EKA2L1*.AppImage
- ~/bin/EKA2L1*.AppImage
-
-
-
-
-
- ~/Applications/EKA2L1/eka2l1_qt.exe
- ~/.local/share/applications/EKA2L1/eka2l1_qt.exe
- ~/.local/bin/EKA2L1/eka2l1_qt.exe
- ~/bin/EKA2L1/eka2l1_qt.exe
-
-
-
-
-
- fbneo
-
-
- ~/Applications/fbneo/fbneo
- ~/.local/share/applications/fbneo/fbneo
- ~/.local/bin/fbneo/fbneo
- ~/bin/fbneo/fbneo
-
-
-
-
-
- flycast
- org.flycast.Flycast
-
-
- ~/Applications/flycast-x86*.AppImage
- ~/.local/share/applications/flycast-x86*.AppImage
- ~/.local/bin/flycast-x86*.AppImage
- ~/bin/flycast-x86*.AppImage
- /var/lib/flatpak/exports/bin/org.flycast.Flycast
- ~/.local/share/flatpak/exports/bin/org.flycast.Flycast
-
-
-
-
-
- flycast-dojo
-
-
- ~/Applications/flycast-dojo*.AppImage
- ~/.local/share/applications/flycast-dojo*.AppImage
- ~/.local/bin/flycast-dojo*.AppImage
- ~/bin/flycast-dojo*.AppImage
-
-
-
-
-
- fs-uae-launcher
- fsuae.launcher
-
-
- /var/lib/flatpak/exports/bin/net.fsuae.FS-UAE|flatpak run --command=fs-uae-launcher net.fsuae.FS-UAE
- ~/.local/share/flatpak/exports/bin/net.fsuae.FS-UAE|flatpak run --command=fs-uae-launcher net.fsuae.FS-UAE
-
-
-
-
-
- fuse
- net.sf.fuse_emulator
-
-
- /var/lib/flatpak/exports/bin/net.sf.fuse_emulator
- ~/.local/share/flatpak/exports/bin/net.sf.fuse_emulator
-
-
-
-
-
- gargoyle
- io.github.garglk.Gargoyle
-
-
- ~/Applications/Gargoyle*.AppImage
- ~/.local/share/applications/Gargoyle*.AppImage
- ~/.local/bin/Gargoyle*.AppImage
- ~/bin/Gargoyle*.AppImage
- /var/lib/flatpak/exports/bin/io.github.garglk.Gargoyle
- ~/.local/share/flatpak/exports/bin/io.github.garglk.Gargoyle
-
-
-
-
-
- gearboy
-
-
- ~/Applications/gearboy/gearboy
- ~/.local/share/applications/gearboy/gearboy
- ~/.local/bin/gearboy/gearboy
- ~/bin/gearboy/gearboy
-
-
-
-
-
- ~/Applications/gopher2600/gopher2600_linux_amd64
- ~/.local/share/applications/gopher2600/gopher2600_linux_amd64
- ~/.local/bin/gopher2600/gopher2600_linux_amd64
- ~/bin/gopher2600/gopher2600_linux_amd64
-
-
-
-
-
- hatari
- org.tuxfamily.hatari
-
-
- /var/lib/flatpak/exports/bin/org.tuxfamily.hatari
- ~/.local/share/flatpak/exports/bin/org.tuxfamily.hatari
-
-
-
-
-
- hypseus.bin
-
-
- ~/Applications/hypseus-singe/hypseus.bin
- ~/.local/share/applications/hypseus-singe/hypseus.bin
- ~/.local/bin/hypseus-singe/hypseus.bin
- ~/bin/hypseus-singe/hypseus.bin
-
-
-
-
-
- lightspark
-
-
- ~/Applications/lightspark/lightspark
- ~/.local/share/applications/lightspark/lightspark
- ~/.local/bin/lightspark/lightspark
- ~/bin/lightspark/lightspark
-
-
-
-
-
- linapple
-
-
- ~/Applications/linapple/linapple
- ~/.local/share/applications/linapple/linapple
- ~/.local/bin/linapple/linapple
- ~/bin/linapple/linapple
-
-
-
-
-
- ~/Applications/m2emulator/EMULATOR.EXE
- ~/.local/share/applications/m2emulator/EMULATOR.EXE
- ~/.local/bin/m2emulator/EMULATOR.EXE
- ~/bin/m2emulator/EMULATOR.EXE
-
-
-
-
-
- mame
- org.mamedev.MAME
-
-
- /var/lib/flatpak/exports/bin/org.mamedev.MAME
- ~/.local/share/flatpak/exports/bin/org.mamedev.MAME
-
-
-
-
-
- mednafen
-
-
- /var/lib/flatpak/exports/bin/com.github.AmatCoder.mednaffe|flatpak run --command=mednafen com.github.AmatCoder.mednaffe
- ~/.local/share/flatpak/exports/bin/com.github.AmatCoder.mednaffe|flatpak run --command=mednafen com.github.AmatCoder.mednaffe
-
-
-
-
-
- melonds
- melonDS
- net.kuribo64.melonDS
-
-
- /var/lib/flatpak/exports/bin/net.kuribo64.melonDS
- ~/.local/share/flatpak/exports/bin/net.kuribo64.melonDS
-
-
-
-
-
- mesen2
-
-
- ~/Applications/Mesen*.AppImage
- ~/.local/share/applications/Mesen*.AppImage
- ~/.local/bin/Mesen*.AppImage
- ~/bin/Mesen*.AppImage
-
-
-
-
-
- mgba
- mgba-qt
- io.mgba.mGBA
-
-
- ~/Applications/mGBA*.AppImage
- ~/.local/share/applications/mGBA*.AppImage
- ~/.local/bin/mGBA*.AppImage
- ~/bin/mGBA*.AppImage
- /var/lib/flatpak/exports/bin/io.mgba.mGBA
- ~/.local/share/flatpak/exports/bin/io.mgba.mGBA
-
-
-
-
-
- m64p
- io.github.m64p.m64p
-
-
- /var/lib/flatpak/exports/bin/io.github.m64p.m64p
- ~/.local/share/flatpak/exports/bin/io.github.m64p.m64p
-
-
-
-
-
- nestopia
- ca._0ldsk00l.Nestopia
-
-
- /var/lib/flatpak/exports/bin/ca._0ldsk00l.Nestopia
- ~/.local/share/flatpak/exports/bin/ca._0ldsk00l.Nestopia
-
-
-
-
-
- openmsx
- org.openmsx.openMSX
-
-
- /var/lib/flatpak/exports/bin/org.openmsx.openMSX
- ~/.local/share/flatpak/exports/bin/org.openmsx.openMSX
-
-
-
-
-
- Oricutron
-
-
- ~/Applications/oricutron/Oricutron
- ~/.local/share/applications/oricutron/Oricutron
- ~/.local/bin/oricutron/Oricutron
- ~/bin/oricutron/Oricutron
-
-
-
-
-
- pcsx2-qt
- net.pcsx2.PCSX2
-
-
- ~/Applications/pcsx2*.AppImage
- ~/.local/share/applications/pcsx2*.AppImage
- ~/.local/bin/pcsx2*.AppImage
- ~/bin/pcsx2*.AppImage
- /var/lib/flatpak/exports/bin/net.pcsx2.PCSX2
- ~/.local/share/flatpak/exports/bin/net.pcsx2.PCSX2
-
-
-
-
-
- PCSX2
- pcsx2
- net.pcsx2.PCSX2
-
-
- /var/lib/flatpak/exports/bin/net.pcsx2.PCSX2
- ~/.local/share/flatpak/exports/bin/net.pcsx2.PCSX2
-
-
-
-
-
- pico8
-
-
- ~/Applications/pico-8/pico8
- ~/.local/share/applications/pico-8/pico8
- ~/.local/bin/pico-8/pico8
- ~/bin/pico-8/pico8
-
-
-
-
-
- org.purei.Play
-
-
- ~/Applications/Play!*.AppImage
- ~/.local/share/applications/Play!*.AppImage
- ~/.local/bin/Play!*.AppImage
- ~/bin/Play!*.AppImage
- /var/lib/flatpak/exports/bin/org.purei.Play
- ~/.local/share/flatpak/exports/bin/org.purei.Play
-
-
-
-
-
- ppsspp-emu.ppsspp-sdl
- PPSSPPSDL
- PPSSPPQt
- org.ppsspp.PPSSPP
-
-
- /var/lib/flatpak/exports/bin/org.ppsspp.PPSSPP
- ~/.local/share/flatpak/exports/bin/org.ppsspp.PPSSPP
-
-
-
-
-
- prboom-plus
-
-
-
-
-
- primehack
- io.github.shiiion.primehack
-
-
- /var/lib/flatpak/exports/bin/io.github.shiiion.primehack
- ~/.local/share/flatpak/exports/bin/io.github.shiiion.primehack
-
-
-
-
-
- ~/Applications/Proton/wine*.AppImage
- ~/.local/share/applications/Proton/wine*.AppImage
- ~/.local/bin/Proton/wine*.AppImage
- ~/bin/Proton/wine*.AppImage
-
-
-
-
-
- punes
-
-
- ~/Applications/punes/punes
- ~/.local/share/applications/punes/punes
- ~/.local/bin/punes/punes
- ~/bin/punes/punes
- /var/lib/flatpak/exports/bin/io.github.punesemu.puNES
- ~/.local/share/flatpak/exports/bin/io.github.punesemu.puNES
-
-
-
-
-
- quasi88
-
-
- ~/Applications/quasi88/quasi88
- ~/.local/share/applications/quasi88/quasi88
- ~/.local/bin/quasi88/quasi88
- ~/bin/quasi88/quasi88
-
-
-
-
-
- redream
-
-
- ~/Applications/redream/redream
- ~/.local/share/applications/redream/redream
- ~/.local/bin/redream/redream
- ~/bin/redream/redream
-
-
-
-
-
- RMG
- com.github.Rosalie241.RMG
-
-
- ~/Applications/RMG*.AppImage
- ~/.local/share/applications/RMG*.AppImage
- ~/.local/bin/RMG*.AppImage
- ~/bin/RMG*.AppImage
- /var/lib/flatpak/exports/bin/com.github.Rosalie241.RMG
- ~/.local/share/flatpak/exports/bin/com.github.Rosalie241.RMG
-
-
-
-
-
- rpcs3
- rpcs3-emu.rpcs3
- net.rpcs3.RPCS3
-
-
- ~/Applications/rpcs3*.AppImage
- ~/.local/share/applications/rpcs3*.AppImage
- ~/.local/bin/rpcs3*.AppImage
- ~/bin/rpcs3*.AppImage
- /var/lib/flatpak/exports/bin/net.rpcs3.RPCS3
- ~/.local/share/flatpak/exports/bin/net.rpcs3.RPCS3
-
-
-
-
-
- ruffle
-
-
- ~/Applications/ruffle/ruffle
- ~/.local/share/applications/ruffle/ruffle
- ~/.local/bin/ruffle/ruffle
- ~/bin/ruffle/ruffle
-
-
-
-
-
- Ryujinx.sh
- Ryujinx
- Ryujinx.Ava
- org.ryujinx.Ryujinx
-
-
- /var/lib/flatpak/exports/bin/org.ryujinx.Ryujinx
- ~/.local/share/flatpak/exports/bin/org.ryujinx.Ryujinx
- ~/Applications/publish/Ryujinx
- ~/.local/share/applications/publish/Ryujinx
- ~/.local/bin/publish/Ryujinx
- ~/bin/publish/Ryujinx
- ~/Applications/publish/Ryujinx.Ava
- ~/.local/share/applications/publish/Ryujinx.Ava
- ~/.local/bin/publish/Ryujinx.Ava
- ~/bin/publish/Ryujinx.Ava
-
-
-
-
-
- sameboy
- io.github.sameboy.SameBoy
-
-
- /var/lib/flatpak/exports/bin/io.github.sameboy.SameBoy
- ~/.local/share/flatpak/exports/bin/io.github.sameboy.SameBoy
-
-
-
-
-
- scummvm
- org.scummvm.ScummVM
-
-
- /var/lib/flatpak/exports/bin/org.scummvm.ScummVM
- ~/.local/share/flatpak/exports/bin/org.scummvm.ScummVM
-
-
-
-
-
- sdl2trs
-
-
- ~/Applications/sdl2trs/sdl2trs
- ~/.local/share/applications/sdl2trs/sdl2trs
- ~/.local/bin/sdl2trs/sdl2trs
- ~/bin/sdl2trs/sdl2trs
-
-
-
-
-
- SheepShaver
-
-
- ~/Applications/SheepShaver*.AppImage
- ~/.local/share/applications/SheepShaver*.AppImage
- ~/.local/bin/SheepShaver*.AppImage
- ~/bin/SheepShaver*.AppImage
-
-
-
-
-
- simcoupe
-
-
- ~/Applications/simcoupe/simcoupe
- ~/.local/share/applications/simcoupe/simcoupe
- ~/.local/bin/simcoupe/simcoupe
- ~/bin/simcoupe/simcoupe
-
-
-
-
-
- simple64-gui
- io.github.simple64.simple64
-
-
- /var/lib/flatpak/exports/bin/io.github.simple64.simple64
- ~/.local/share/flatpak/exports/bin/io.github.simple64.simple64
-
-
-
-
-
- SkyEmu
-
-
- ~/Applications/SkyEmu/SkyEmu
- ~/.local/share/applications/SkyEmu/SkyEmu
- ~/.local/bin/SkyEmu/SkyEmu
- ~/bin/SkyEmu/SkyEmu
-
-
-
-
-
- snes9x
- snes9x-gtk
- com.snes9x.Snes9x
-
-
- ~/Applications/Snes9x*.AppImage
- ~/.local/share/applications/Snes9x*.AppImage
- ~/.local/bin/Snes9x*.AppImage
- ~/bin/Snes9x*.AppImage
- /var/lib/flatpak/exports/bin/com.snes9x.Snes9x
- ~/.local/share/flatpak/exports/bin/com.snes9x.Snes9x
-
-
-
-
-
- solarus-run
- solarus.run
-
-
- /var/lib/flatpak/exports/bin/org.solarus_games.solarus.Launcher|flatpak run --command=solarus-run org.solarus_games.solarus.Launcher
- ~/.local/share/flatpak/exports/bin/org.solarus_games.solarus.Launcher|flatpak run --command=solarus-run org.solarus_games.solarus.Launcher
-
-
-
-
-
- steam
-
-
-
-
-
- stella
- io.github.stella_emu.Stella
-
-
- /var/lib/flatpak/exports/bin/io.github.stella_emu.Stella
- ~/.local/share/flatpak/exports/bin/io.github.stella_emu.Stella
-
-
-
-
-
- supermodel
-
-
- ~/Applications/Supermodel/supermodel
- ~/.local/share/applications/Supermodel/supermodel
- ~/.local/bin/Supermodel/supermodel
- ~/bin/Supermodel/supermodel
- /var/lib/flatpak/exports/bin/com.supermodel3.Supermodel
- ~/.local/share/flatpak/exports/bin/com.supermodel3.Supermodel
-
-
-
-
-
- tic80
- com.tic80.TIC_80
-
-
- /var/lib/flatpak/exports/bin/com.tic80.TIC_80
- ~/.local/share/flatpak/exports/bin/com.tic80.TIC_80
-
-
-
-
-
- dolphin-emu-triforce
-
-
- ~/Applications/dolphin-emu-triforce*.AppImage
- ~/.local/share/applications/dolphin-emu-triforce*.AppImage
- ~/.local/bin/dolphin-emu-triforce*.AppImage
- ~/bin/dolphin-emu-triforce*.AppImage
-
-
-
-
-
- ~/Applications/tsugaru/Tsugaru_CUI
- ~/.local/share/applications/tsugaru/Tsugaru_CUI
- ~/.local/bin/tsugaru/Tsugaru_CUI
- ~/bin/tsugaru/Tsugaru_CUI
-
-
-
-
-
- visualboyadvance-m
-
-
-
-
-
- x64sc
- vice-jz.x64sc
- net.sf.VICE
-
-
- /var/lib/flatpak/exports/bin/net.sf.VICE
- ~/.local/share/flatpak/exports/bin/net.sf.VICE
-
-
-
-
-
- xplus4
- vice-jz.xplus4
-
-
- /var/lib/flatpak/exports/bin/net.sf.VICE|flatpak run --command=xplus4 net.sf.VICE
- ~/.local/share/flatpak/exports/bin/net.sf.VICE|flatpak run --command=xplus4 net.sf.VICE
-
-
-
-
-
- xvic
- vice-jz.xvic
-
-
- /var/lib/flatpak/exports/bin/net.sf.VICE|flatpak run --command=xvic net.sf.VICE
- ~/.local/share/flatpak/exports/bin/net.sf.VICE|flatpak run --command=xvic net.sf.VICE
-
-
-
-
-
- VPinballX_GL
-
-
- ~/Applications/VPinballX/VPinballX_GL
- ~/.local/share/applications/VPinballX/VPinballX_GL
- ~/.local/bin/VPinballX/VPinballX_GL
- ~/bin/VPinballX/VPinballX_GL
-
-
-
-
-
- vita3k
- Vita3K
-
-
- ~/Applications/Vita3K*.AppImage
- ~/.local/share/applications/Vita3K*.AppImage
- ~/.local/bin/Vita3K*.AppImage
- ~/bin/Vita3K*.AppImage
- ~/Applications/Vita3K/Vita3K
- ~/.local/share/applications/Vita3K/Vita3K
- ~/.local/bin/Vita3K/Vita3K
- ~/bin/Vita3K/Vita3K
-
-
-
-
-
- xemu
- app.xemu.xemu
-
-
- ~/Applications/xemu*.AppImage
- ~/.local/share/applications/xemu*.AppImage
- ~/.local/bin/xemu*.AppImage
- ~/bin/xemu*.AppImage
- /var/lib/flatpak/exports/bin/app.xemu.xemu
- ~/.local/share/flatpak/exports/bin/app.xemu.xemu
-
-
-
-
-
- ~/Applications/Wine/wine*.AppImage
- ~/.local/share/applications/Wine/wine*.AppImage
- ~/.local/bin/Wine/wine*.AppImage
- ~/bin/Wine/wine*.AppImage
-
-
-
-
-
- ~/Applications/xenia/xenia.exe
- ~/.local/share/applications/xenia/xenia.exe
- ~/.local/bin/xenia/xenia.exe
- ~/bin/xenia/xenia.exe
- ~/Applications/xenia/xenia_canary.exe
- ~/.local/share/applications/xenia/xenia_canary.exe
- ~/.local/bin/xenia/xenia_canary.exe
- ~/bin/xenia/xenia_canary.exe
-
-
-
-
-
- xroar
-
-
- ~/Applications/xroar/xroar
- ~/.local/share/applications/xroar/xroar
- ~/.local/bin/xroar/xroar
- ~/bin/xroar/xroar
-
-
-
-
-
- yuzu
- org.yuzu_emu.yuzu
-
-
- ~/Applications/yuzu*.AppImage
- ~/.local/share/applications/yuzu*.AppImage
- ~/.local/bin/yuzu*.AppImage
- ~/bin/yuzu*.AppImage
- /var/lib/flatpak/exports/bin/org.yuzu_emu.yuzu
- ~/.local/share/flatpak/exports/bin/org.yuzu_emu.yuzu
-
-
-
-
-
- ~/retrodeck/customs/yuzu/yuzu*.AppImage
-
-
-
-
-
- zesarux
-
-
- ~/Applications/ZEsarUX/zesarux
- ~/.local/share/applications/ZEsarUX/zesarux
- ~/.local/bin/ZEsarUX/zesarux
- ~/bin/ZEsarUX/zesarux
-
-
-
diff --git a/es-configs/es_settings.xml b/es-configs/es_settings.xml
index cad78b67..c1d69bd9 100644
--- a/es-configs/es_settings.xml
+++ b/es-configs/es_settings.xml
@@ -2,6 +2,7 @@
+
@@ -21,6 +22,7 @@
+
@@ -65,6 +67,7 @@
+
@@ -145,13 +148,15 @@
-
+
+
-
+
+
diff --git a/es-configs/es_systems.xml b/es-configs/es_systems.xml
deleted file mode 100644
index 9baca300..00000000
--- a/es-configs/es_systems.xml
+++ /dev/null
@@ -1,2248 +0,0 @@
-
-
-
-
- 3do
- 3DO Interactive Multiplayer
- %ROMPATH%/3do
- .bin .BIN .chd .CHD .cue .CUE .iso .ISO .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/opera_libretro.so %ROM%
- 3do
- 3do
-
-
-
- adam
- Coleco Adam
- %ROMPATH%/adam
- .1dd .1DD .bin .BIN .col .COL .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .ddp .DDP .dfi .DFI .dsk .DSK .hfe .HFE .imd .IMD .mfi .MFI .mfm .MFM .rom .ROM .td0 .TD0 .wav .WAV .7z .7Z .zip .ZIP
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/adam adam -flop1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/adam adam -cass1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/adam adam -cart1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/adam adam %BASENAME%
- adam
- adam
-
-
-
-
- amiga
- Commodore Amiga
- %ROMPATH%/amiga
- .adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM%
- %EMULATOR_FS-UAE% %ROM%
- %STARTDIR%=%EMUDIR% %EMULATOR_AMIBERRY% --autoload %ROM%
- amiga
- amiga
-
-
- amiga1200
- Commodore Amiga 1200
- %ROMPATH%/amiga1200
- .adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM%
- %EMULATOR_FS-UAE% %ROM%
- %STARTDIR%=%EMUDIR% %EMULATOR_AMIBERRY% --autoload %ROM%
- amiga
- amiga1200
-
-
- amiga600
- Commodore Amiga 600
- %ROMPATH%/amiga600
- .adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM%
- %EMULATOR_FS-UAE% %ROM%
- %STARTDIR%=%EMUDIR% %EMULATOR_AMIBERRY% --autoload %ROM%
- amiga
- amiga600
-
-
- amigacd32
- Commodore Amiga CD32
- %ROMPATH%/amigacd32
- .adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM%
- %EMULATOR_FS-UAE% --config:amiga-model=CD32 %ROM%
- %STARTDIR%=%EMUDIR% %EMULATOR_AMIBERRY% --model CD32 --autoload %ROM%
- amigacd32
- amigacd32
-
-
- amstradcpc
- Amstrad CPC
- %ROMPATH%/amstradcpc
- .cdt .CDT .cpr .CPR .dsk .DSK .kcr .KCR .m3u .M3U .sna .SNA .tap .TAR .voc .VOC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/cap32_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/crocods_libretro.so %ROM%
- %STARTDIR%=~/.CPCemu %EMULATOR_CPCEMU% %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/amstradcpc cpc6128 -flop1 %ROM%
- amstradcpc
- amstradcpc
-
-
- android
- Google Android
- %ROMPATH%/android
- .7z .7Z .zip .ZIP
- PLACEHOLDER %ROM%
- android
- android
-
-
-
- apple2
- Apple II
- %ROMPATH%/apple2
- .do .DO .dsk .DSK .nib .NIB .po .PO
-
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2\" -flop1 \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2 apple2e -flop1 %ROM%
- apple2
- apple2
-
-
-
- apple2gs
- Apple IIGS
- %ROMPATH%/apple2gs
- .2mg .2MG .7z .7z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2gs\" -flop3 \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2gs apple2gs -flop3 %ROM%
- apple2gs
- apple2gs
-
-
-
- arcade
- Arcade
- %ROMPATH%/arcade
- .cmd .CMD .desktop .sh .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/arcade %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
- %EMULATOR_FINALBURN-NEO% -fullscreen %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM%
- %EMULATOR_FLYCAST% %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM%
-
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- arcade
- arcade
-
-
-
- arcadia
- Emerson Arcadia 2001
- %ROMPATH%/arcadia
- .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "arcadia -rompath \"%GAMEDIRRAW%;%ROMPATH%/arcadia\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/arcadia arcadia -cart %ROM%
- arcadia
- arcadia
-
-
-
- archimedes
- Acorn Archimedes
- %ROMPATH%/archimedes
- .1dd .1DD .360 .adf .ADF .adl .ADL .adm .ADM .ads .ADS .apd .APD .bbc .BBC .chd .CHD .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .dfi .DFI .dsd .DSD .dsk .DSK .hfe .HFE .ima .IMA .imd .IMD .img .IMG .ipf .IPF .jfd .JFD .mfi .MFI .mfm .MFM .msa .MSA .ssd .SSD .st .ST .td0 .TD0 .ufi .UFI .7z .7Z .zip .ZIP
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/archimedes aa4401 -flop1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/archimedes aa3000 -flop1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/archimedes aa310 -flop1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/archimedes aa540 -flop1 %ROM%
- archimedes
- archimedes
-
-
-
- arduboy
- Arduboy Miniature Game System
- %ROMPATH%/arduboy
- .hex .HEX .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/arduous_libretro.so %ROM%
- arduboy
- arduboy
-
-
- astrocde
- Bally Astrocade
- %ROMPATH%/astrocde
- .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "astrocde -rompath \"%GAMEDIRRAW%;%ROMPATH%/astrocde\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/astrocde astrocde -cart %BASENAME%
- astrocde
- astrocade
-
-
- atari2600
- Atari 2600
- %ROMPATH%/atari2600
- .a26 .A26 .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/stella_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/stella2014_libretro.so %ROM%
-
-
-
- atari2600
- atari2600
-
-
- atari5200
- Atari 5200
- %ROMPATH%/atari5200
- .a52 .A52 .atr .ATR .atx .ATX .bin .BIN .car .CAR .cas .CAS .cdm .CDM .rom .ROM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/a5200_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/atari800_libretro.so %ROM%
-
- atari5200
- atari5200
-
-
- atari7800
- Atari 7800 ProSystem
- %ROMPATH%/atari7800
- .a78 .A78 .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/prosystem_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "a7800 -rompath \"%GAMEDIRRAW%;%ROMPATH%/atari7800\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/atari7800 a7800 -cart %ROM%
- atari7800
- atari7800
-
-
- atari800
- Atari 800
- %ROMPATH%/atari800
- .a52 .A52 .atr .ATR .atx .ATX .bin .BIN .car .CAR .cas .CAS .cdm .CDM .rom .ROM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/atari800_libretro.so %ROM%
- %EMULATOR_ATARI800% %ROM%
- atari800
- atari800
-
-
- atarijaguar
- Atari Jaguar
- %ROMPATH%/atarijaguar
- .abs .ABS .bin .BIN .cdi .CDI .cof .COF .cue .CUE .j64 .J64 .jag .JAG .prg .PRG .rom .ROM .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/virtualjaguar_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/atarijaguar jaguar -cart %ROM%
-
-
- atarijaguar
- atarijaguar
-
-
-
- atarilynx
- Atari Lynx
- %ROMPATH%/atarilynx
- .lnx .LNX .o .O .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/handy_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_lynx_libretro.so %ROM%
-
- atarilynx
- atarilynx
-
-
- atarist
- Atari ST
- %ROMPATH%/atarist
- .st .ST .msa .MSA .stx .STX .dim .DIM .ipf .IPF .m3u .M3U .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/hatari_libretro.so %ROM%
-
- atarist
- atarist
-
-
- atarixe
- Atari XE
- %ROMPATH%/atarixe
- .a52 .A52 .atr .ATR .atx .ATX .bin .BIN .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/atari800_libretro.so %ROM%
-
- atarixe
- atarixe
-
-
- atomiswave
- Sammy Corporation Atomiswave
- %ROMPATH%/atomiswave
- .bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM%
-
-
- arcade
- atomiswave
-
-
-
- bbcmicro
- Acorn Computers BBC Micro
- %ROMPATH%/bbcmicro
- .dsd .DSD .img .IMG .ssd .SSD .7z .7Z .zip .ZIP
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -flop1 %ROM%
- bbcmicro
- bbcmicro
-
-
-
- c64
- Commodore 64
- %ROMPATH%/c64
- .bin .BIN .cmd .CMD .crt .CRT .d2m .D2M .d4m .D4M .d64 .D64 .d6z .D6Z .d71 .D71 .d7z .D7Z .d80 .D80 .d81 .D81 .d82 .D82 .d8z .D8Z .g41 .G41 .g4z .G4Z .g64 .G64 .g6z .G6Z .gz .GZ .lnx .LNX .m3u .M3U .nbz .NBZ .nib .NIB .p00 .P00 .prg .PRG .t64 .T64 .tap .TAP .vfl .VFL .vsf .VSF .x64 .X64 .x6z .X6Z .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_x64sc_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_x64_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_xscpu64_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_x128_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/frodo_libretro.so %ROM%
- c64
- c64
-
-
- cdimono1
- Philips CD-i
- %ROMPATH%/cdimono1
- .chd .CHD .cue .CUE .iso .ISO
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/same_cdi_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/cdi2015_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cdimono1 cdimono1 -cdrom %ROM%
- cdimono1
- cdimono1
-
-
- cdtv
- Commodore CDTV
- %ROMPATH%/cdtv
- .ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM%
-
-
- cdtv
- cdtv
-
-
- chailove
- ChaiLove Game Engine
- %ROMPATH%/chailove
- .chai .CHAI .chailove .CHAILOVE .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/chailove_libretro.so %ROM%
- love
- chailove
-
-
- channelf
- Fairchild Channel F
- %ROMPATH%/channelf
- .bin .BIN .chf .CHF .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/freechaf_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "channelf -rompath \"%GAMEDIRRAW%;%ROMPATH%/channelf\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/channelf channelf -cart %ROM%
- channelf
- channelf
-
-
-
- coco
- Tandy Color Computer
- %ROMPATH%/coco
- .cas .CAS .ccc .CCC .dsk .DSK .rom .ROM
- %EMULATOR_XROAR% -fs -default-machine coco2bus %ROM%
- %EMULATOR_XROAR% -fs -default-machine coco2b %ROM%
- coco
- coco
-
-
-
- colecovision
- Coleco ColecoVision
- %ROMPATH%/colecovision
- .bin .BIN .cas .CAS .col .COL .cv .CV .dsk .DSK .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ri .RI .rom .ROM .sc .SC .sg .SG .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearcoleco_libretro.so %ROM%
-
-
- colecovision
- colecovision
-
-
- consolearcade
- Console Arcade Systems
- %ROMPATH%/consolearcade
- .arcadedef .desktop .iso .ISO .sh .xbe .XBE .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/consolearcade %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM%
-
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM%
-
-
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
-
- %INJECT%=%BASENAME%.esprefix %EMULATOR_XEMU% -dvd_path %ROM%
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- arcade
- consolearcade
-
-
- cps
- Capcom Play System
- %ROMPATH%/cps
- .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cps %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps1_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps2_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps3_libretro.so %ROM%
- arcade
- cps
-
-
- cps1
- Capcom Play System I
- %ROMPATH%/cps1
- .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cps1 %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps1_libretro.so %ROM%
- arcade
- cps1
-
-
- cps2
- Capcom Play System II
- %ROMPATH%/cps2
- .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cps2 %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps2_libretro.so %ROM%
- arcade
- cps2
-
-
- cps3
- Capcom Play System III
- %ROMPATH%/cps3
- .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/cps3 %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps3_libretro.so %ROM%
- arcade
- cps3
-
-
-
- crvision
- VTech CreatiVision
- %ROMPATH%/crvision
- .bin .BIN .rom .ROM .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "crvision -rompath %GAMEDIR%\;%ROMPATH%/crvision -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/crvision crvision -cart %ROM%
- crvision
- crvision
-
-
-
-
- daphne
- Daphne Arcade LaserDisc Emulator
- %ROMPATH%/daphne
- .daphne .dirksimple .ogv .OGV .singe .7z .7Z .zip .ZIP
-
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/daphne %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dirksimple_libretro.so %ROM%
- daphne, arcade
- daphne
-
-
-
- doom
- Doom
- %ROMPATH%/doom
- .doom .DOOM .desktop .ipk3 .IPK3 .iwad .IWAD .pk3 .PK3 .pk4 .PK4 .pwad .PWAD .sh .wad .WAD
- gzdoom.sh %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/prboom_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/boom3_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/boom3_xp_libretro.so %ROM%
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- pc, pcwindows
- doom
-
-
- dos
- DOS (PC)
- %ROMPATH%/dos
- .bat .BAT .com .COM .conf .CONF .cue .CUE .dosz .DOSZ .exe .EXE .iso .ISO .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_pure_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_core_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_svn_libretro.so %ROM%
-
-
- dos
- dos
-
-
-
- dreamcast
- Sega Dreamcast
- %ROMPATH%/dreamcast
- .cdi .CDI .chd .CHD .cue .CUE .dat .DAT .elf .ELF .gdi .GDI .iso .ISO .lst .LST .m3u .M3U .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM%
-
-
-
- dreamcast
- dreamcast
-
-
- easyrpg
- EasyRPG Game Engine
- %ROMPATH%/easyrpg
- .easyrpg .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/easyrpg_libretro.so %ROM%
-
- easyrpg
- easyrpg
-
-
-
- electron
- Acorn Electron
- %ROMPATH%/electron
- .1dd .1DD .adf .ADF .adl .ADL .adm .ADM .ads .ADS .bbc .BBC .bin .BIN .cqi .CQI .cqm .CQM .csw .CSW .d77 .D77 .d88 .D88 .dfi .DFI .dsd .DSD .dsk .DSK .hfe .HFE .imd .IMD .img .IMG .mfi .MFI .mfm .MFM .rom .ROM .ssd .SSD .td0 .TD0 .uef .UEF .wav .WAV .7z .7Z .zip .ZIP
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/electron electron64 -autoboot_delay "2" -autoboot_command "*T.\nCH.\"\"\n" -cass1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/electron electron64 -exp plus1 -cart1 seds -autoboot_delay "2" -autoboot_command "*CAT\n\n\n\n\n\n*EXEC !BOOT\n" -flop1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/electron electron64 -exp plus3 -exp:plus3:fdc:1 35dd -autoboot_delay "2" -autoboot_command "*CAT\n\n\n\n\n\n*RUN !BOOT\n" -flop1 %ROM%
- electron
- electron
-
-
-
-
- famicom
- Nintendo Family Computer
- %ROMPATH%/famicom
- .3dsen .3DSEN .fds .FDS .nes .NES .unf .UNF .unif .UNIF .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/nestopia_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fceumm_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/quicknes_libretro.so %ROM%
-
-
-
-
-
-
- famicom
- famicom
-
-
- fba
- FinalBurn Alpha
- %ROMPATH%/fba
- .iso .ISO .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_neogeo_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps1_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps2_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_cps3_libretro.so %ROM%
- arcade
- fba
-
-
- fbneo
- FinalBurn Neo
- %ROMPATH%/fbneo
- .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
-
- arcade
- fbneo
-
-
- fds
- Nintendo Famicom Disk System
- %ROMPATH%/fds
- .nes .NES .fds .FDS .unf .UNF .UNIF .UNIF .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/nestopia_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fceumm_libretro.so %ROM%
-
-
- fds
- fds
-
-
-
-
- fm7
- Fujitsu FM-7
- %ROMPATH%/fm7
- .1dd .1DD .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .dfi .DFI .dsk .DSK .hfe .HFE .imd .IMD .mfi .MFI .mfm .MFM .t77 .T77 .td0 .TD0 .wav .WAV .7z .7Z .zip .ZIP
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm7 -flop1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm7 -autoboot_delay "5" -autoboot_command "load\n\n\nrun\n" -cass1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm7 %BASENAME%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm77av -flop1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm77av -autoboot_delay "5" -autoboot_command "load\n\n\nrun\n" -cass1 %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fm7 fm77av %BASENAME%
- fm7
- fm7
-
-
-
-
- fmtowns
- Fujitsu FM Towns
- %ROMPATH%/fmtowns
- .cdr .CDR .chd .CHD .cue .CUE .gdi .GDI .iso .ISO
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "fmtownshr -rompath \"%GAMEDIRRAW%;%ROMPATH%/fmtowns\" -cdrom \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/fmtowns fmtowns %BASENAME%
-
- fmtowns
- fmtowns
-
-
-
-
-
- gamate
- Bit Corporation Gamate
- %ROMPATH%/gamate
- .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "gamate -rompath \"%GAMEDIRRAW%;%ROMPATH%/gamate\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gamate gamate -cart %ROM%
- gamate
- gamate
-
-
-
- gameandwatch
- Nintendo Game and Watch
- %ROMPATH%/gameandwatch
- .mgw .MGW .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
-
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gameandwatch %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gw_libretro.so %ROM%
- gameandwatch
- gameandwatch
-
-
-
- gamecom
- Tiger Electronics Game.com
- %ROMPATH%/gamecom
- .tgc .TGC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "gamecom -rompath \"%GAMEDIRRAW%;%ROMPATH%/gamecom\" -cartridge1 \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gamecom gamecom -cartridge1 %ROM%
- gamecom
- gamecom
-
-
-
- gamegear
- Sega Game Gear
- %ROMPATH%/gamegear
- .68k .68K .bin .BIN .bms .BMS .chd .CHD .col .COL .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .rom .ROM .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearsystem_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/smsplus_libretro.so %ROM%
-
-
-
-
- gamegear
- gamegear
-
-
- gb
- Nintendo Game Boy
- %ROMPATH%/gb
- .bs .BS .cgb .CGB .dmg .DMG .gb .GB .gbc .GBC .sgb .SGB .sfc .SFC .smc .SMC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gambatte_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/sameboy_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearboy_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/tgbdual_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/DoubleCherryGB_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mgba_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vbam_libretro.so %ROM%
-
-
-
-
- gb
- gb
-
-
- gba
- Nintendo Game Boy Advance
- %ROMPATH%/gba
- .agb .AGB .bin .BIN .cgb .CGB .dmg .DMG .gb .GB .gba .GBA .gbc .GBC .sgb .SGB .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mgba_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vbam_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vba_next_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gpsp_libretro.so %ROM%
-
-
-
- gba
- gba
-
-
- gbc
- Nintendo Game Boy Color
- %ROMPATH%/gbc
- .bs .BS .cgb .CGB .dmg .DMG .gb .GB .gbc .GBC .sgb .SGB .sfc .SFC .smc .SMC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gambatte_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/sameboy_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearboy_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/tgbdual_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/DoubleCherryGB_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mgba_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vbam_libretro.so %ROM%
-
-
-
-
- gbc
- gbc
-
-
- gc
- Nintendo GameCube
- %ROMPATH%/gc
- .ciso .CISO .dff .DFF .dol .DOL .elf .ELF .gcm .GCM .gcz .GCZ .iso .ISO .json .JSON .m3u .M3U .rvz .RVZ .tgc .TGC .wad .WAD .wbfs .WBFS .wia .WIA .7z .7Z .zip .ZIP
- %INJECT%=%BASENAME%.esprefix %EMULATOR_DOLPHIN% -b -e %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dolphin_libretro.so %ROM%
- %INJECT%=%BASENAME%.esprefix %EMULATOR_PRIMEHACK% -b -e %ROM%
-
- gc
- gc
-
-
- genesis
- Sega Genesis
- %ROMPATH%/genesis
- .32x .32X .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/blastem_libretro.so %ROM%
-
-
-
- genesis
- genesis
-
-
-
- gmaster
- Hartung Game Master
- %ROMPATH%/gmaster
- .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "gmaster -rompath \"%GAMEDIRRAW%;%ROMPATH%/gmaster\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gmaster gmaster -cart %ROM%
- gmaster
- gmaster
-
-
-
- gx4000
- Amstrad GX4000
- %ROMPATH%/gx4000
- .bin .BIN .cdt .CDT .cpr .CPR .dsk .DSK .kcr .KCR .m3u .M3U .sna .SNA .tap .TAR .voc .VOC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/cap32_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/crocods_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/gx4000 gx4000 -cart %ROM%
- gx4000
- gx4000
-
-
- intellivision
- Mattel Electronics Intellivision
- %ROMPATH%/intellivision
- .bin .BIN .int .INT .rom .ROM .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/freeintv_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "intv -rompath \"%GAMEDIRRAW%;%ROMPATH%/intellivision\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/intellivision intv -cart %ROM%
- intellivision
- intellivision
-
-
- j2me
- Java 2 Micro Edition (J2ME)
- %ROMPATH%/j2me
- .jar .JAR .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/squirreljme_libretro.so %ROM%
- android
- j2me
-
-
- laserdisc
- LaserDisc Games
- %ROMPATH%/laserdisc
- .daphne .dirksimple .ogv .OGV .singe .7z .7Z .zip .ZIP
-
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/laserdisc %BASENAME%
- daphne, arcade
- laserdisc
-
-
- lcdgames
- LCD Handheld Games
- %ROMPATH%/lcdgames
- .mgw .MGW .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
-
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/lcdgames %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gw_libretro.so %ROM%
- lcdgames, gameandwatch
- lcdgames
-
-
-
- lutro
- Lutro Game Engine
- %ROMPATH%/lutro
- .lua .LUA .lutro .LUTRO .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/lutro_libretro.so %ROM%
- lutro
- lutro
-
-
- mame
- Multiple Arcade Machine Emulator
- %ROMPATH%/mame
- .cmd .CMD .desktop .sh .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2010_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2003_plus_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame2000_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/mame %BASENAME%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbalpha2012_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM%
-
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM%
-
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- arcade
- mame
-
-
-
- mame-advmame
- AdvanceMAME
- %ROMPATH%/mame-advmame
- .7z .7Z .zip .ZIP
- %STARTDIR%=~/.advance %EMULATOR_ADVANCEMAME% %BASENAME%
- arcade
- mame-advmame
-
-
-
- mastersystem
- Sega Master System
- %ROMPATH%/mastersystem
- .68k .68K .bin .BIN .bms .BMS .chd .CHD .col .COL .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .rom .ROM .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/smsplus_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearsystem_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM%
-
-
-
- mastersystem
- mastersystem
-
-
- megacd
- Sega Mega-CD
- %ROMPATH%/megacd
- .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM%
-
- segacd
- megacd
-
-
- megacdjp
- Sega Mega-CD
- %ROMPATH%/megacdjp
- .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM%
-
- segacd
- megacdjp
-
-
- megadrive
- Sega Mega Drive
- %ROMPATH%/megadrive
- .32x .32X .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/blastem_libretro.so %ROM%
-
-
-
- megadrive
- megadrive
-
-
- megaduck
- Creatronic Mega Duck
- %ROMPATH%/megaduck
- .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/sameduck_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "megaduck -rompath \"%GAMEDIRRAW%;%ROMPATH%/megaduck\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/megaduck megaduck -cart %ROM%
- megaduck
- megaduck
-
-
- mess
- Multi Emulator Super System
- %ROMPATH%/mess
- .chd .CHD .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mess2015_libretro.so %ROM%
- mess
- mess
-
-
-
- model2
- Sega Model 2
- %ROMPATH%/model2
- .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/model2 %BASENAME%
-
-
- arcade
- model2
-
-
-
- moonlight
- Moonlight Game Streaming
- %ROMPATH%/moonlight
- .moonlight .MOONLIGHT .7z .7Z .zip .ZIP
- PLACEHOLDER %ROM%
- moonlight
- moonlight
-
-
- moto
- Thomson MO/TO Series
- %ROMPATH%/moto
- .fd .FD .k7 .K7 .m5 .M5 .m7 .M7 .rom .ROM .sap .SAP .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/theodore_libretro.so %ROM%
- moto
- moto
-
-
- msx
- MSX
- %ROMPATH%/msx
- .cas .CAS .col .COL .di1 .DI1 .di2 .DI2 .dmk .DMK .dsk .DSK .fd1 .FD1 .fd2 .FD2 .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ogv .OGV .ri .RI .rom .ROM .sc .SC .sg .SG .wav .WAV .xsa .XSA .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fmsx_libretro.so %ROM%
-
-
-
- msx
- msx
-
-
- msx1
- MSX1
- %ROMPATH%/msx1
- .cas .CAS .col .COL .di1 .DI1 .di2 .DI2 .dmk .DMK .dsk .DSK .fd1 .FD1 .fd2 .FD2 .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ogv .OGV .ri .RI .rom .ROM .sc .SC .sg .SG .wav .WAV .xsa .XSA .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fmsx_libretro.so %ROM%
-
-
-
- msx
- msx1
-
-
- msx2
- MSX2
- %ROMPATH%/msx2
- .cas .CAS .col .COL .di1 .DI1 .di2 .DI2 .dmk .DMK .dsk .DSK .fd1 .FD1 .fd2 .FD2 .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ogv .OGV .ri .RI .rom .ROM .sc .SC .sg .SG .wav .WAV .xsa .XSA .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fmsx_libretro.so %ROM%
-
-
-
- msx2
- msx2
-
-
- msxturbor
- MSX Turbo R
- %ROMPATH%/msxturbor
- .cas .CAS .col .COL .di1 .DI1 .di2 .DI2 .dmk .DMK .dsk .DSK .fd1 .FD1 .fd2 .FD2 .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ogv .OGV .ri .RI .rom .ROM .sc .SC .sg .SG .wav .WAV .xsa .XSA .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM%
-
-
- msxturbor
- msxturbor
-
-
-
- mugen
- M.U.G.E.N Game Engine
- %ROMPATH%/mugen
- .mugen
- %STARTDIR%=%GAMEDIR% %EMULATOR_OS-SHELL% -c "%ROM%"
- mugen
- mugen
-
-
-
- multivision
- Othello Multivision
- %ROMPATH%/multivision
- .bin .BIN .gg .GG .rom .ROM .sg .SG .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearsystem_libretro.so %ROM%
-
- sg-1000
- multivision
-
-
- n3ds
- Nintendo 3DS
- %ROMPATH%/n3ds
- .3ds .3DS .3dsx .3DSX .app .APP .axf .AXF .cci .CCI .cxi .CXI .elf .ELF .7z .7Z .zip .ZIP
- %EMULATOR_CITRA% %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra2018_libretro.so %ROM%
- n3ds
- n3ds
-
-
- n64
- Nintendo 64
- %ROMPATH%/n64
- .bin .BIN .d64 .D64 .n64 .N64 .ndd .NDD .u1 .U1 .v64 .V64 .z64 .Z64 .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mupen64plus_next_libretro.so %ROM%
-
-
-
-
-
- n64
- n64
-
-
- n64dd
- Nintendo 64DD
- %ROMPATH%/n64dd
- .bin .BIN .d64 .D64 .n64 .N64 .ndd .NDD .u1 .U1 .v64 .V64 .z64 .Z64 .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/parallel_n64_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mupen64plus_next_libretro.so %ROM%
-
-
- n64
- n64dd
-
-
- naomi
- Sega NAOMI
- %ROMPATH%/naomi
- .bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM%
-
-
- arcade
- naomi
-
-
- naomi2
- Sega NAOMI 2
- %ROMPATH%/naomi2
- .bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM%
-
-
- arcade
- naomi2
-
-
- naomigd
- Sega NAOMI GD-ROM
- %ROMPATH%/naomigd
- .bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/flycast_libretro.so %ROM%
-
-
- arcade
- naomigd
-
-
- nds
- Nintendo DS
- %ROMPATH%/nds
- .app .APP .bin .BIN .nds .NDS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/desmume_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/desmume2015_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melonds_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melondsds_libretro.so %ROM%
- %EMULATOR_MELONDS% %ROM%
-
- nds
- nds
-
-
- neogeo
- SNK Neo Geo
- %ROMPATH%/neogeo
- .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
-
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/neogeo %BASENAME%
- neogeo
- neogeo
-
-
- neogeocd
- SNK Neo Geo CD
- %ROMPATH%/neogeocd
- .chd .CHD .cue .CUE
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/neocd_libretro.so %ROM%
- %EMULATOR_RETROARCH% --subsystem neocd -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
-
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/neogeocd neocdz -cdrm %ROM%
- neogeocd
- neogeocd
-
-
- neogeocdjp
- SNK Neo Geo CD
- %ROMPATH%/neogeocdjp
- .chd .CHD .cue .CUE
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/neocd_libretro.so %ROM%
- %EMULATOR_RETROARCH% --subsystem neocd -L %CORE_RETROARCH%/fbneo_libretro.so %ROM%
-
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/neogeocdjp neocdz -cdrm %ROM%
- neogeocd
- neogeocdjp
-
-
- nes
- Nintendo Entertainment System
- %ROMPATH%/nes
- .3dsen .3DSEN .fds .FDS .nes .NES .unf .UNF .unif .UNIF .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/nestopia_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fceumm_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/quicknes_libretro.so %ROM%
-
-
-
-
- nes
- nes
-
-
-
- ngp
- SNK Neo Geo Pocket
- %ROMPATH%/ngp
- .ngc .NGC .ngp .NGP .ngpc .NGPC .npc .NPC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_ngp_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/race_libretro.so %ROM%
-
-
- ngp
- ngp
-
-
- ngpc
- SNK Neo Geo Pocket Color
- %ROMPATH%/ngpc
- .ngc .NGC .ngp .NGP .ngpc .NGPC .npc .NPC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_ngp_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/race_libretro.so %ROM%
-
-
- ngpc
- ngpc
-
-
- odyssey2
- Magnavox Odyssey 2
- %ROMPATH%/odyssey2
- .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/o2em_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "odyssey2 -rompath \"%GAMEDIRRAW%;%ROMPATH%/odyssey2\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/odyssey2 odyssey2 -cart %ROM%
- odyssey2
- odyssey2
-
-
-
- openbor
- OpenBOR Game Engine
- %ROMPATH%/openbor
- .AppImage
- %STARTDIR%=%GAMEDIR% %EMULATOR_OS-SHELL% -c "%ROM%"
- openbor
- openbor
-
-
-
-
- palm
- Palm OS
- %ROMPATH%/palm
- .img .IMG .pqa .PQA .prc .PRC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mu_libretro.so %ROM%
- palm
- palm
-
-
- pc88
- NEC PC-8800 Series
- %ROMPATH%/pc88
- .88d .88D .cmt .CMT .d88 .D88 .m3u .M3U .t88 .T88 .u88 .U88
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/quasi88_libretro.so %ROM%
-
- pc88
- pc88
-
-
- pc98
- NEC PC-9800 Series
- %ROMPATH%/pc98
- .2hd .2HD .88d .88D .98d .98D .d88 .D88 .d98 .D98 .cmd .CMD .dup .DUP .fdd .FDD .fdi .FDI .hdd .HDD .hdi .HDI .hdm .HDM .hdn .HDN .m3u .M3U .nhd .NHD .tfd .TFD .thd .THD .xdf .XDF .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/np2kai_libretro.so %ROM%
- %STARTDIR%=%GAMEDIR% %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/nekop2_libretro.so %ROM%
- pc98
- pc98
-
-
- pcengine
- NEC PC Engine
- %ROMPATH%/pcengine
- .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_fast_libretro.so %ROM%
-
-
-
- pcengine
- pcengine
-
-
- pcenginecd
- NEC PC Engine CD
- %ROMPATH%/pcenginecd
- .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_fast_libretro.so %ROM%
-
-
-
- pcenginecd
- pcenginecd
-
-
- pcfx
- NEC PC-FX
- %ROMPATH%/pcfx
- .ccd .CCD .chd .CHD .cue CUE .m3u .M3U .toc .TOC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pcfx_libretro.so %ROM%
-
- pcfx
- pcfx
-
-
- pico8
- PICO-8 Fantasy Console
- %ROMPATH%/pico8
- .p8 .P8 .png .PNG
- %EMULATOR_PICO-8% -desktop_path ~/retrodeck/screenshots -root_path %GAMEDIR% -run %ROM%
- %EMULATOR_PICO-8% -desktop_path ~/retrodeck/screenshots -root_path %GAMEDIR% -splore
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/retro8_libretro.so %ROM%
- pico8
- pico8
-
-
- plus4
- Commodore Plus/4
- %ROMPATH%/plus4
- .bin .BIN .cmd .CMD .crt .CRT .d2m .D2M .d4m .D4M .d64 .D64 .d6z .D6Z .d71 .D71 .d7z .D7Z .d80 .D80 .d81 .D81 .d82 .D82 .d8z .D8Z .g41 .G41 .g4z .G4Z .g64 .G64 .g6z .G6Z .gz .GZ .lnx .LNX .m3u .M3U .nbz .NBZ .nib .NIB .p00 .P00 .prg .PRG .t64 .T64 .tap .TAP .vfl .VFL .vsf .VSF .x64 .X64 .x6z .X6Z .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_xplus4_libretro.so %ROM%
-
- plus4
- plus4
-
-
- pokemini
- Nintendo Pokémon Mini
- %ROMPATH%/pokemini
- .min .MIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/pokemini_libretro.so %ROM%
- pokemini
- pokemini
-
-
- ports
- Ports
- %ROMPATH%/ports
- .AppImage .desktop .exe .EXE .game .GAME .phd .PHD .psx .PSX .sh
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- %EMULATOR_OS-SHELL% -c "%ROM%"
-
-
-
-
- pc, pcwindows
- ports
-
-
- ps2
- Sony PlayStation 2
- %ROMPATH%/ps2
- .arcadedef .bin .BIN .chd .CHD .ciso .CISO .cso .CSO .dump .DUMP .elf .ELF .gz .GZ .m3u .M3U .mdf .MDF .img .IMG .iso .ISO .isz .ISZ .ngr .NRG .zso .ZSO
- %EMULATOR_PCSX2% -batch %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/pcsx2_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/pcsx2_libretro.so %ROM%
-
-
- ps2
- ps2
-
-
- ps3
- Sony PlayStation 3
- %ROMPATH%/ps3
- .desktop .ps3 .PS3 .ps3dir .PS3DIR
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- %EMULATOR_RPCS3% --no-gui %ROM%
- ps3
- ps3
-
-
-
- psp
- Sony PlayStation Portable
- %ROMPATH%/psp
- .chd .CHD .cso .CSO .elf .ELF .iso .ISO .pbp .PBP .prx .PRX .7z .7Z .zip .ZIP
- %EMULATOR_PPSSPP% %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/ppsspp_libretro.so %ROM%
- psp
- psp
-
-
-
- psvita
- Sony PlayStation Vita
- %ROMPATH%/psvita
- .psvita
- %EMULATOR_VITA3K% -r %INJECT%=%BASENAME%.psvita
- psvita
- psvita
-
-
-
- psx
- Sony PlayStation
- %ROMPATH%/psx
- .bin .BIN .cbn .CBN .ccd .CCD .chd .CHD .cue .CUE .ecm .ECM .exe .EXE .img .IMG .iso .ISO .m3u .M3U .mdf .MDF .mds .MDS .minipsf .MINIPSF .pbp .PBP .psexe .PSEXE .psf .PSF .toc .TOC .z .Z .znx .ZNX .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/swanstation_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_psx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_psx_hw_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/pcsx_rearmed_libretro.so %ROM%
- %EMULATOR_DUCKSTATION% -batch %ROM%
-
-
- psx
- psx
-
-
-
- pv1000
- Casio PV-1000
- %ROMPATH%/pv1000
- .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "pv1000 -rompath \"%GAMEDIRRAW%;%ROMPATH%/pv1000\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/pv1000 pv1000 -cart %ROM%
- pv1000
- pv1000
-
-
-
- quake
- Quake
- %ROMPATH%/quake
- .desktop .pak .PAK .pk3 .PK3 .sh
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/tyrquake_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake2_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake2-rogue_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake2-xatrix_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake2-zaero_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vitaquake3_libretro.so %ROM%
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- pc, pcwindows
- quake
-
-
-
- satellaview
- Nintendo Satellaview
- %ROMPATH%/satellaview
- .bml .BML .bs .BS .fig .FIG .sfc .SFC .smc .SMC .swc .SWC .st .ST .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM%
-
-
- satellaview
- satellaview
-
-
- saturn
- Sega Saturn
- %ROMPATH%/saturn
- .bin .BIN .ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .toc .TOC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_saturn_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/yabasanshiro_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/yabause_libretro.so %ROM%
-
- saturn
- saturn
-
-
- saturnjp
- Sega Saturn
- %ROMPATH%/saturnjp
- .bin .BIN .ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .toc .TOC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_saturn_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/yabasanshiro_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/yabause_libretro.so %ROM%
-
- saturn
- saturnjp
-
-
- scummvm
- ScummVM Game Engine
- %ROMPATH%/scummvm
- .scummvm .SCUMMVM .svm .SVM
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/scummvm_libretro.so %ROM%
-
- scummvm
- scummvm
-
-
-
- scv
- Epoch Super Cassette Vision
- %ROMPATH%/scv
- .0 .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "scv -rompath \"%GAMEDIRRAW%;%ROMPATH%/scv\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/scv scv -cart %ROM%
- scv
- scv
-
-
-
- sega32x
- Sega Mega Drive 32X
- %ROMPATH%/sega32x
- .32x .32X .68k .68K .bin .BIN .cue .CUE .gen .GEN .iso .ISO .md .MD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM%
-
- sega32x
- sega32x
-
-
- sega32xjp
- Sega Super 32X
- %ROMPATH%/sega32xjp
- .32x .32X .68k .68K .bin .BIN .cue .CUE .gen .GEN .iso .ISO .md .MD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM%
-
- sega32x
- sega32xjp
-
-
- sega32xna
- Sega Genesis 32X
- %ROMPATH%/sega32xna
- .32x .32X .68k .68K .bin .BIN .cue .CUE .gen .GEN .iso .ISO .md .MD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM%
-
- sega32x
- sega32xna
-
-
- segacd
- Sega CD
- %ROMPATH%/segacd
- .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/picodrive_libretro.so %ROM%
-
- segacd
- segacd
-
-
- sfc
- Nintendo SFC (Super Famicom)
- %ROMPATH%/sfc
- .bin .BIN .bml .BML .bs .BS .bsx .BSX .dx2 .DX2 .fig .FIG .gd3 .GD3 .gd7 .GD7 .mgd .MGD .sfc .SFC .smc .SMC .st .ST .swc .SWC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supafaust_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM%
-
-
-
- snes
- sfc
-
-
- sg-1000
- Sega SG-1000
- %ROMPATH%/sg-1000
- .68k .68K .bin .BIN .bms .BMS .chd .CHD .cue .CUE .gen .GEN .gg .GG .iso .ISO .m3u .M3U .md .MD .mdx .MDX .ri .RI .rom .ROM .sg .SG .sgd .SGD .smd .SMD .sms .SMS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/genesis_plus_gx_wide_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearsystem_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM%
-
-
- sg-1000
- sg-1000
-
-
- sgb
- Nintendo Super Game Boy
- %ROMPATH%/sgb
- .gb .GB .gbc .GBC .sgb .SGB .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/sameboy_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mgba_libretro.so %ROM%
-
- sgb
- sgb
-
-
- snes
- Nintendo SNES (Super Nintendo)
- %ROMPATH%/snes
- .bin .BIN .bml .BML .bs .BS .bsx .BSX .dx2 .DX2 .fig .FIG .gd3 .GD3 .gd7 .GD7 .mgd .MGD .sfc .SFC .smc .SMC .st .ST .swc .SWC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supafaust_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM%
-
-
-
- snes
- snes
-
-
- snesna
- Nintendo SNES (Super Nintendo)
- %ROMPATH%/snesna
- .bin .BIN .bml .BML .bs .BS .bsx .BSX .dx2 .DX2 .fig .FIG .gd3 .GD3 .gd7 .GD7 .mgd .MGD .sfc .SFC .smc .SMC .st .ST .swc .SWC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supafaust_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM%
-
-
-
- snes
- snesna
-
-
-
- solarus
- Solarus Game Engine
- %ROMPATH%/solarus
- .solarus
- %EMULATOR_SOLARUS% %ROM%
- solarus
- solarus
-
-
-
- spectravideo
- Spectravideo
- %ROMPATH%/spectravideo
- .cas .CAS .col .COL .dsk .DSK .m3u .M3U .mx1 .MX1 .mx2 .MX2 .ri .RI .rom .ROM .sc .SC .sg .SG .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bluemsx_libretro.so %ROM%
- spectravideo
- spectravideo
-
-
- stv
- Sega Titan Video Game System
- %ROMPATH%/stv
- .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/kronos_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/stv %BASENAME%
-
- arcade
- stv
-
-
- sufami
- Bandai SuFami Turbo
- %ROMPATH%/sufami
- .bml .BML .bs .BS .fig .FIG .sfc .SFC .smc .SMC .st .ST .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM%
-
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_hd_beta_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM%
-
-
- sufami
- sufami
-
-
- supergrafx
- NEC SuperGrafx
- %ROMPATH%/supergrafx
- .ccd .CCD .chd .CHD .cue .CUE .pce .PCE .sgx .SGX .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supergrafx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM%
-
-
-
- supergrafx
- supergrafx
-
-
- supervision
- Watara Supervision
- %ROMPATH%/supervision
- .bin .BIN .sv .SV .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/potator_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "svision -rompath \"%GAMEDIRRAW%;%ROMPATH%/supervision\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/supervision svision -cart %ROM%
- supervision
- supervision
-
-
-
- supracan
- Funtech Super A'Can
- %ROMPATH%/supracan
- .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "supracan -rompath \"%GAMEDIRRAW%;%ROMPATH%/supracan\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/supracan supracan -cart %ROM%
- supracan
- supracan
-
-
-
- switch
- Nintendo Switch
- %ROMPATH%/switch
- .nca .NCA .nro .NRO .nso .NSO .nsp .NSP .xci .XCI
- %INJECT%=%BASENAME%.esprefix %EMULATOR_YUZU% -f -g %ROM%
- %EMULATOR_RYUJINX% %ROM%
- %INJECT%=%BASENAME%.esprefix %EMULATOR_YUZU-CUSTOM% -f -g %ROM%
- switch
- switch
-
-
- symbian
- Symbian
- %ROMPATH%/symbian
- .sis .SIS .sisx .SISX .symbian
- %EMULATOR_EKA2L1% --fullscreen --device RH-29 --run "%BASENAME%"
- %EMULATOR_EKA2L1% --fullscreen --device RM-84 --run "%BASENAME%"
- %EMULATOR_EKA2L1% --fullscreen --device RM-507 --run "%BASENAME%"
- %EMULATOR_EKA2L1% --fullscreen --device %INJECT%=%BASENAME%.device --run "%BASENAME%"
- ngage
- symbian
-
-
-
- tg16
- NEC TurboGrafx-16
- %ROMPATH%/tg16
- .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_fast_libretro.so %ROM%
-
-
-
- pcengine
- tg16
-
-
- tg-cd
- NEC TurboGrafx-CD
- %ROMPATH%/tg-cd
- .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_pce_fast_libretro.so %ROM%
-
-
-
- pcenginecd
- tg-cd
-
-
-
- ti99
- Texas Instruments TI-99
- %ROMPATH%/ti99
- .rpk .RPK .7z .7Z .zip .ZIP
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/ti99 ti99_4a -ioport peb -ioport:peb:slot3 speech -cart %BASENAME%
- ti99
- ti99
-
-
-
- tic80
- TIC-80 Fantasy Computer
- %ROMPATH%/tic80
- .tic .TIC
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/tic80_libretro.so %ROM%
-
- tic80
- tic80
-
-
- to8
- Thomson TO8
- %ROMPATH%/to8
- .fd .FD .k7 .K7 .m5 .M5 .m7 .M7 .rom .ROM .sap .SAP .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/theodore_libretro.so %ROM%
- moto
- to8
-
-
-
- uzebox
- Uzebox Open Source Console
- %ROMPATH%/uzebox
- .uze .UZE .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/uzem_libretro.so %ROM%
- uzebox
- uzebox
-
-
- vectrex
- GCE Vectrex
- %ROMPATH%/vectrex
- .bin .BIN .gam .GAM .vc .VC .vec .VEC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vecx_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "vectrex -rompath \"%GAMEDIRRAW%;%ROMPATH%/vectrex\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/vectrex vectrex -cart %ROM%
- vectrex
- vectrex
-
-
- vic20
- Commodore VIC-20
- %ROMPATH%/vic20
- .bin .BIN .cmd .CMD .crt .CRT .d2m .D2M .d4m .D4M .d64 .D64 .d6z .D6Z .d71 .D71 .d7z .D7Z .d80 .D80 .d81 .D81 .d82 .D82 .d8z .D8Z .g41 .G41 .g4z .G4Z .g64 .G64 .g6z .G6Z .gz .GZ .lnx .LNX .m3u .M3U .nbz .NBZ .nib .NIB .p00 .P00 .prg .PRG .t64 .T64 .tap .TAP .vfl .VFL .vsf .VSF .x64 .X64 .x6z .X6Z .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_xvic_libretro.so %ROM%
-
- vic20
- vic20
-
-
- videopac
- Philips Videopac G7000
- %ROMPATH%/videopac
- .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/o2em_libretro.so %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "videopac -rompath \"%GAMEDIRRAW%;%ROMPATH%/videopac\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/videopac videopac -cart %ROM%
- odyssey2
- videopac
-
-
- virtualboy
- Nintendo Virtual Boy
- %ROMPATH%/virtualboy
- .bin .BIN .vb .VB .vboy .VBOY .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_vb_libretro.so %ROM%
-
- virtualboy
- virtualboy
-
-
-
-
- vsmile
- VTech V.Smile
- %ROMPATH%/vsmile
- .bin .BIN .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "vsmile -rompath \"%GAMEDIRRAW%;%ROMPATH%/vsmile\" -cart \"%ROMRAW%\""
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/vsmile vsmile -cart %ROM%
- vsmile
- vsmile
-
-
-
- wasm4
- WASM-4 Fantasy Console
- %ROMPATH%/wasm4
- .wasm .WASM
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/wasm4_libretro.so %ROM%
- wasm4
- wasm4
-
-
- wii
- Nintendo Wii
- %ROMPATH%/wii
- .ciso .CISO .dff .DFF .dol .DOL .elf .ELF .gcm .GCM .gcz .GCZ .iso .ISO .json .JSON .m3u .M3U .rvz .RVZ .tgc .TGC .wad .WAD .wbfs .WBFS .wia .WIA .7z .7Z .zip .ZIP
- %INJECT%=%BASENAME%.esprefix %EMULATOR_DOLPHIN% -b -e %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dolphin_libretro.so %ROM%
- %INJECT%=%BASENAME%.esprefix %EMULATOR_PRIMEHACK% -b -e %ROM%
- wii
- wii
-
-
- wiiu
- Nintendo Wii U
- %ROMPATH%/wiiu
- .rpx .RPX .wua .WUA .wud .WUD .wux .WUX
- %EMULATOR_CEMU% -g %ROM%
- wiiu
- wiiu
-
-
- windows
- Microsoft Windows
- %ROMPATH%/windows
- .AppImage .desktop .sh
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- %RUNINBACKGROUND% %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- %EMULATOR_OS-SHELL% -c "%ROM%"
- %RUNINBACKGROUND% %EMULATOR_OS-SHELL% -c "%ROM%"
- pcwindows
- windows
-
-
- windows3x
- Microsoft Windows 3.x
- %ROMPATH%/windows3x
- .AppImage .bat .BAT .desktop .dosz .DOSZ .sh .7z .7Z .zip .ZIP
- %STARTDIR%=%GAMEDIR% %EMULATOR_DOSBOX-X% -defaultdir %GAMEDIR% %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_pure_libretro.so %ROM%
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- %RUNINBACKGROUND% %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- %EMULATOR_OS-SHELL% -c "%ROM%"
- %RUNINBACKGROUND% %EMULATOR_OS-SHELL% -c "%ROM%"
- windows3x
- windows3x
-
-
- windows9x
- Microsoft Windows 9x
- %ROMPATH%/windows9x
- .AppImage .bat .BAT .desktop .dosz .DOSZ .sh .7z .7Z .zip .ZIP
- %STARTDIR%=%GAMEDIR% %EMULATOR_DOSBOX-X% -defaultdir %GAMEDIR% %ROM%
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_pure_libretro.so %ROM%
- %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- %RUNINBACKGROUND% %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%
- %EMULATOR_OS-SHELL% -c "%ROM%"
- %RUNINBACKGROUND% %EMULATOR_OS-SHELL% -c "%ROM%"
- pcwindows
- windows9x
-
-
- wonderswan
- Bandai WonderSwan
- %ROMPATH%/wonderswan
- .pc2 .PC2 .ws .WS .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_wswan_libretro.so %ROM%
-
-
-
- wonderswan
- wonderswan
-
-
- wonderswancolor
- Bandai WonderSwan Color
- %ROMPATH%/wonderswancolor
- .pc2 .PC2 .ws .WS .wsc .WSC .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_wswan_libretro.so %ROM%
-
-
- wonderswancolor
- wonderswancolor
-
-
- x1
- Sharp X1
- %ROMPATH%/x1
- .2d .2D .2hd .2HD .88d .88D .cmd .CMD .d88 .D88 .dup .DUP .dx1 .DX1 .hdm .HDM .tap .TAP .tfd .TFD .xdf .XDF .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/x1_libretro.so %ROM%
- x1
- x1
-
-
- x68000
- Sharp X68000
- %ROMPATH%/x68000
- .2hd .2HD .88d .88D .cmd .CMD .d88 .D88 .dim .DIM .dup .DUP .hdf .HDF .hdm .HDM .img .IMG .m3u .M3U .xdf .XDF .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/px68k_libretro.so %ROM%
- %STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/x68000 x68000 -flop1 %ROM%
- x68000
- x68000
-
-
- xbox
- Microsoft Xbox
- %ROMPATH%/xbox
- .iso .ISO
- %INJECT%=%BASENAME%.esprefix %EMULATOR_XEMU% -dvd_path %ROM%
- xbox
- xbox
-
-
-
-
- zx81
- Sinclair ZX81
- %ROMPATH%/zx81
- .p .P .tzx .TZX .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/81_libretro.so %ROM%
- zx81
- zx81
-
-
-
- zxspectrum
- Sinclair ZX Spectrum
- %ROMPATH%/zxspectrum
- .dsk .DSK .gz .GZ .img .IMG .mgt .MGT .rzx .RZX .scl .SCL .sh .SH .sna .SNA .szx .SZX .tap .TAP .trd .TRD .tzx .TZX .udi .UDI .z80 .Z80 .7z .7Z .zip .ZIP
- %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/fuse_libretro.so %ROM%
-
- zxspectrum
- zxspectrum
-
-
\ No newline at end of file
diff --git a/functions/050_save_migration.sh b/functions/050_save_migration.sh
index 41213705..b75672b4 100644
--- a/functions/050_save_migration.sh
+++ b/functions/050_save_migration.sh
@@ -13,7 +13,7 @@ save_migration() {
# ROMs on Internal
roms_folder="$HOME/retrodeck/roms"
fi
- echo "ROMs folder found at $roms_folder"
+ log i "ROMs folder found at $roms_folder"
# Unhiding downloaded media from the previous versions
if [ -d "$rdhome/.downloaded_media" ]
@@ -28,12 +28,12 @@ save_migration() {
fi
# Doing the dir prep as we don't know from which version we came
- dir_prep "$media_folder" "/var/config/emulationstation/ES-DE/downloaded_media"
- dir_prep "$themes_folder" "/var/config/emulationstation/ES-DE/themes"
- mkdir -pv $rdhome/logs #this was added later, maybe safe to remove in a few versions
+ dir_prep "$media_folder" "/var/config/ES-DE/downloaded_media"
+ dir_prep "$themes_folder" "/var/config/ES-DE/themes"
+ create_dir $rdhome/logs #this was added later, maybe safe to remove in a few versions
# Resetting es_settings, now we need it but in the future I should think a better solution, maybe with sed
- cp -fv /app/retrodeck/es_settings.xml /var/config/emulationstation/ES-DE/es_settings.xml
+ cp -fv /app/retrodeck/es_settings.xml /var/config/ES-DE/settings/es_settings.xml
# 0.4 -> 0.5
# Perform save and state migration if needed
@@ -72,9 +72,9 @@ save_migration() {
gamestoskip=
tar -C $rdhome -czf $save_backup_file saves # Backup save directory for safety
- echo "Saves backed up to" $save_backup_file >> $migration_logfile
+ log i "Saves backed up to" $save_backup_file $migration_logfile
tar -C $rdhome -czf $state_backup_file states # Backup state directory for safety
- echo "States backed up to" $state_backup_file >> $migration_logfile
+ log i "States backed up to" $state_backup_file $migration_logfile
(
movefile() { # Take matching save and rom files and sort save into appropriate system folder
@@ -92,21 +92,22 @@ save_migration() {
gamestoskip+=("$1")
return
fi
- echo "INFO: Examining ROM file:" "$game" >> $migration_logfile
- echo "INFO: System detected as" $systemdir >> $migration_logfile
+ log i "Examining ROM file:" "$game" $migration_logfile
+ log i "System detected as" $systemdir $migration_logfile
sosfile=$(sed -e "s/\^/ /g" <<< "$2") # Remove whitespace placeholder from s-ave o-r s-tate file
sospurebasename="$(basename "$sosfile")" # Extract pure file name ie. /saves/game1.sav becomes game1
- echo "INFO: Current save or state being examined for match:" $sosfile >> $migration_logfile
- echo "INFO: Matching save or state" $sosfile "and game" $game "found." >> $migration_logfile
- echo "INFO: Moving save or state to" $current_dest_folder"/"$systemdir"/"$sosbasename >> $migration_logfile
+ log i "Current save or state being examined for match:" $sosfile $migration_logfile
+ log i "Matching save or state" $sosfile "and game" $game "found." $migration_logfile
+ log i "Moving save or state to $current_dest_folder/$systemdir/$sosbasename" $migration_logfile
if [[ ! -d $current_dest_folder"/"$systemdir ]]; then # If system directory doesn't exist for save yet, create it
- echo "WARNING: Creating missing system directory" $current_dest_folder"/"$systemdir
+ log w "Creating missing system directory $current_dest_folder/$systemdir"
mkdir $current_dest_folder/$systemdir
fi
mv "$sosfile" -t $current_dest_folder/$systemdir # Move save to appropriate system directory
return
else
- echo "WARNING: Game with name" "$(basename "$1" | sed -e "s/\^/ /g")" "already found. Skipping to next game..." >> $migration_logfile # Inform user of game being skipped due to duplicate ROM names
+ local name="$(basename "$1" | sed -e "s/\^/ /g")"
+ log w "Game with name \"$name\" already found. Skipping to next game..." $migration_logfile # Inform user of game being skipped due to duplicate ROM names
fi
}
@@ -167,6 +168,6 @@ save_migration() {
fi
else
- echo "Version" $version "is after the save and state organization was changed, no need to sort again"
+ log i "Version $version is after the save and state organization was changed, no need to sort again"
fi
}
diff --git a/functions/checks.sh b/functions/checks.sh
index 7b76d82f..2bd9af51 100644
--- a/functions/checks.sh
+++ b/functions/checks.sh
@@ -28,9 +28,22 @@ check_desktop_mode() {
fi
}
+check_is_steam_deck() {
+ # This function will check the internal product ID for the Steam Deck codename and return "true" if RetroDECK is running on a real Deck
+ # USAGE: if [[ $(check_is_steam_deck) == "true" ]]; then
+
+ if [[ $(cat /sys/devices/virtual/dmi/id/product_name) =~ ^(Jupiter|Galileo)$ ]]; then
+ echo "true"
+ else
+ echo "false"
+ fi
+}
+
check_for_version_update() {
# This function will perform a basic online version check and alert the user if there is a new version available.
+ log d "Entering funtcion check_for_version_update"
+
wget -q --spider "https://api.github.com/repos/XargonWan/$update_repo/releases/latest"
if [ $? -eq 0 ]; then
@@ -60,33 +73,73 @@ check_for_version_update() {
# exit 1
# fi
# TODO: add the logic to check and update the branch from the configuration file
+ log i "Showing new version found dialog"
choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="OK" --extra-button="Ignore this version" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
- --title "RetroDECK Update Available" \
- --text="There is a new version of RetroDECK on the stable release channel $online_version. Please update through the Discover app!\n\nIf you would like to ignore this version and recieve a notification at the NEXT version,\nclick the \"Ignore this version\" button.")
+ --title "RetroDECK - New Update Available" \
+ --text="There is a new version of RetroDECK available: $online_version .\nYou can easily update from the app store you have installed, examples: KDE Discover or Gnome Software.\n\nIf you would like to ignore this notification, click the \"Ignore this version\" button.")
rc=$? # Capture return code, as "OK" button has no text value
if [[ $rc == "1" ]]; then # If any button other than "OK" was clicked
+ log i "Selected: \"OK\""
set_setting_value $rd_conf "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks
fi
elif [[ "$update_repo" == "RetroDECK-cooker" ]] && [[ ! $version == $online_version ]]; then
+ log i "Showing update request dialog as \"$online_version\" was found and is greater then \"$version\""
choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="Yes" --extra-button="No" --extra-button="Ignore this version" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
- --title "RetroDECK Update Available" \
- --text="There is a more recent build of the RetroDECK cooker branch.\nYou are running version $hard_version, the latest is $online_version.\n\nWould you like to update to it?\nIf you would like to skip reminders about this version, click \"Ignore this version\".\nYou will be reminded again at the next version update.\n\nIf you would like to disable these update notifications entirely, disable Online Update Checks in the Configurator.")
+ --title "RetroDECK - New Cooker Version Available" \
+ --text="There is a more recent version of RetroDECK cooker.\nYou are running version $hard_version . The latest is $online_version .\n\nWould you like to update?\nIf you would like to ignore this notification, click the \"Ignore this version\" button.\n\nIf you would like to disable these notifications entirely: disable Online Update Checks in the Configurator.")
rc=$? # Capture return code, as "Yes" button has no text value
if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked
if [[ $choice == "Ignore this version" ]]; then
+ log i "\"Ignore this version\" selected, updating \"$rd_conf\""
set_setting_value $rd_conf "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks.
fi
else # User clicked "Yes"
+ log i "Selected: \"Yes\""
configurator_generic_dialog "RetroDECK Online Update" "The update process may take several minutes.\n\nAfter the update is complete, RetroDECK will close. When you run it again you will be using the latest version."
(
- local latest_cooker_download=$(curl --silent https://api.github.com/repos/XargonWan/$update_repo/releases/latest | grep '"browser_download_url":' | sed -E 's/.*"([^"]+)".*/\1/')
- mkdir -p "$rdhome/RetroDECK_Updates"
- wget -P "$rdhome/RetroDECK_Updates" $latest_cooker_download
- flatpak-spawn --host flatpak remove --noninteractive -y net.retrodeck.retrodeck # Remove current version before installing new one, to avoid duplicates
- flatpak-spawn --host flatpak install --user --bundle --noninteractive -y "$rdhome/RetroDECK_Updates/RetroDECK-cooker.flatpak"
- rm -rf "$rdhome/RetroDECK_Updates" # Cleanup old bundles to save space
+ local latest_cooker_download=$(curl --silent https://api.github.com/repos/XargonWan/RetroDECK-cooker/releases/latest | grep '"browser_download_url":.*flatpak' | grep -v '\.sha' | sed -E 's/.*"([^"]+)".*/\1/')
+ local temp_folder="$rdhome/RetroDECK_Updates"
+ create_dir $temp_folder
+ log i "Downloading version \"$online_version\" in \"$temp_folder/RetroDECK-cooker.flatpak\" from url: \"$latest_cooker_download\""
+ # Downloading the flatpak file
+ wget -P "$temp_folder" "$latest_cooker_download"
+ # And its sha
+ wget -P "$temp_folder" "$latest_cooker_download.sha"
+
+ # Get the expected SHA checksum from the SHA file
+ local expected_sha=$(cat "$temp_folder/$(basename "$latest_cooker_download").sha" | awk '{print $1}')
+
+ # Check if the file exists
+ if [ -f "$temp_folder/RetroDECK-cooker.flatpak" ]; then
+ # Calculate the actual SHA checksum of the file
+ actual_sha=$(sha256sum "$temp_folder/RetroDECK-cooker.flatpak" | awk '{print $1}')
+
+ # Log the found and expected SHA checksums
+ log d "Found SHA: $actual_sha"
+ log d "Expected SHA: $expected_sha"
+
+ # Check if the SHA checksum matches
+ if [ "$actual_sha" = "$expected_sha" ]; then
+ log d "Flatpak file \"$temp_folder/RetroDECK-cooker.flatpak\" found and SHA checksum matches, proceeding."
+ log d "Uninstalling old RetroDECK flatpak"
+ # Remove current version before installing new one, to avoid duplicates
+ flatpak-spawn --host flatpak remove --noninteractive -y net.retrodeck.retrodeck && log d "Uninstallation successful"
+ log d "Installing new flatpak file from: \"$temp_folder/RetroDECK-cooker.flatpak\""
+ flatpak-spawn --host flatpak install --user --bundle --noninteractive -y "$temp_folder/RetroDECK-cooker.flatpak" && log d "Installation successful"
+ else
+ log e "Flatpak file \"$temp_folder/RetroDECK-cooker.flatpak\" found but SHA checksum does not match. Quitting."
+ configurator_generic_dialog "RetroDECK Online Update" "There was an error during the update: flatpak file found but SHA checksum does not match. Please check the log file."
+ exit 1
+ fi
+ else
+ log e "Flatpak file \"$temp_folder/RetroDECK-cooker.flatpak\" NOT FOUND. Quitting."
+ configurator_generic_dialog "RetroDECK Online Update" "There was an error during the update: flatpak file not found. Please check the log file."
+ exit 1
+ fi
+
+ rm -rf "$temp_folder" # Cleanup old bundles to save space
) |
zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
@@ -111,3 +164,43 @@ validate_input() {
fi
done < $input_validation
}
+
+check_version_is_older_than() {
+# This function will determine if a given version number is newer than the one currently read from retrodeck.cfg (which will be the previous running version at update time) and will return "true" if it is
+# The given version to check should be in normal RetroDECK version notation of N.N.Nb (eg. 0.8.0b)
+# USAGE: check_version_is_older_than "version"
+
+local current_version="$version"
+local new_version="$1"
+local is_newer_version="false"
+
+current_version_major_rev=$(sed 's/^\([0-9]*\)\..*/\1/' <<< "$current_version")
+new_version_major_rev=$(sed 's/^\([0-9]*\)\..*/\1/' <<< "$new_version")
+
+current_version_minor_rev=$(sed 's/^[0-9]*\.\([0-9]*\)\..*/\1/' <<< "$current_version")
+new_version_minor_rev=$(sed 's/^[0-9]*\.\([0-9]*\)\..*/\1/' <<< "$new_version")
+
+current_version_point_rev=$(sed 's/^[0-9]*\.[0-9]*\.\([0-9]*\).*/\1/' <<< "$current_version")
+new_version_point_rev=$(sed 's/^[0-9]*\.[0-9]*\.\([0-9]*\).*/\1/' <<< "$new_version")
+
+if [[ "$new_version_major_rev" -gt "$current_version_major_rev" ]]; then
+ is_newer_version="true"
+elif [[ "$new_version_major_rev" -eq "$current_version_major_rev" ]]; then
+ if [[ "$new_version_minor_rev" -gt "$current_version_minor_rev" ]]; then
+ is_newer_version="true"
+ elif [[ "$new_version_minor_rev" -eq "$current_version_minor_rev" ]]; then
+ if [[ "$new_version_point_rev" -gt "$current_version_point_rev" ]]; then
+ is_newer_version="true"
+ fi
+ fi
+fi
+
+# Perform post_update commands for current version if it is a cooker
+if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build, always perform post_update commands for current version
+ if [[ "$(echo $hard_version | cut -d'-' -f2)" == "$new_version" ]]; then
+ is_newer_version="true"
+ fi
+fi
+
+echo "$is_newer_version"
+}
diff --git a/functions/cloud_sync.sh b/functions/cloud_sync.sh
new file mode 100644
index 00000000..05a7907c
--- /dev/null
+++ b/functions/cloud_sync.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+
diff --git a/functions/compression.sh b/functions/compression.sh
index 72876292..bb33cd2e 100644
--- a/functions/compression.sh
+++ b/functions/compression.sh
@@ -2,7 +2,7 @@
compress_game() {
# Function for compressing one or more files to .chd format
- # USAGE: compress_game $format $full_path_to_input_file
+ # USAGE: compress_game $format $full_path_to_input_file $system(optional)
local file="$2"
local filename_no_path=$(basename "$file")
local filename_no_extension="${filename_no_path%.*}"
@@ -10,7 +10,17 @@ compress_game() {
local dest_file=$(dirname "$(realpath "$file")")"/""$filename_no_extension"
if [[ "$1" == "chd" ]]; then
- /app/bin/chdman createcd -i "$source_file" -o "$dest_file".chd
+ case "$3" in # Check platform-specific compression options
+ "psp" )
+ /app/bin/chdman createdvd --hunksize 2048 -i "$source_file" -o "$dest_file".chd -c zstd
+ ;;
+ "ps2" )
+ /app/bin/chdman createdvd -i "$source_file" -o "$dest_file".chd -c zstd
+ ;;
+ * )
+ /app/bin/chdman createcd -i "$source_file" -o "$dest_file".chd
+ ;;
+ esac
elif [[ "$1" == "zip" ]]; then
zip -jq9 "$dest_file".zip "$source_file"
elif [[ "$1" == "rvz" ]]; then
@@ -30,6 +40,8 @@ find_compatible_compression_format() {
echo "zip"
elif echo "$normalized_filename" | grep -qE '\.iso|\.gcm' && [[ $(sed -n '/^\[/{h;d};/\b'"$system"'\b/{g;s/\[\(.*\)\]/\1/p;q};' $compression_targets) == "rvz" ]]; then
echo "rvz"
+ elif echo "$normalized_filename" | grep -qE '\.iso' && [[ $(sed -n '/^\[/{h;d};/\b'"$system"'\b/{g;s/\[\(.*\)\]/\1/p;q};' $compression_targets) == "cso" ]]; then
+ echo "cso"
else
# If no compatible format can be found for the input file
echo "none"
@@ -43,36 +55,35 @@ validate_for_chd() {
local file="$1"
local normalized_filename=$(echo "$file" | tr '[:upper:]' '[:lower:]')
local file_validated="false"
- chd_validation_log_file="compression_$(basename "$file").log"
- echo "Validating file:" "$file" > "$logs_folder/$chd_validation_log_file"
+ log i "Validating file: $file"
if echo "$normalized_filename" | grep -qE '\.iso|\.cue|\.gdi'; then
- echo ".cue/.iso/.gdi file detected" >> "$logs_folder/$chd_validation_log_file"
+ log i ".cue/.iso/.gdi file detected"
local file_path=$(dirname "$(realpath "$file")")
local file_base_name=$(basename "$file")
local file_name=${file_base_name%.*}
if [[ "$normalized_filename" == *".cue" ]]; then # Validate .cue file
if [[ ! "$file_path" == *"dreamcast"* ]]; then # .bin/.cue compression may not work for Dreamcast, only GDI or ISO # TODO: verify
- echo "Validating .cue associated .bin files" >> "$logs_folder/$chd_validation_log_file"
+ log i "Validating .cue associated .bin files"
local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file")
- echo "Associated bin files read:" >> "$logs_folder/$chd_validation_log_file"
- printf '%s\n' "$cue_bin_files" >> "$logs_folder/$chd_validation_log_file"
+ log i "Associated bin files read:"
+ log i $(printf '%s\n' "$cue_bin_files")
if [[ ! -z "$cue_bin_files" ]]; then
while IFS= read -r line
do
- echo "looking for $file_path/$line" >> "$logs_folder/$chd_validation_log_file"
+ log i "Looking for $file_path/$line"
if [[ -f "$file_path/$line" ]]; then
- echo ".bin file found at $file_path/$line" >> "$logs_folder/$chd_validation_log_file"
+ log i ".bin file found at $file_path/$line"
file_validated="true"
else
- echo ".bin file NOT found at $file_path/$line" >> "$logs_folder/$chd_validation_log_file"
- echo ".cue file could not be validated. Please verify your .cue file contains the correct corresponding .bin file information and retry." >> "$logs_folder/$chd_validation_log_file"
+ log e ".bin file NOT found at $file_path/$line"
+ log e ".cue file could not be validated. Please verify your .cue file contains the correct corresponding .bin file information and retry."
file_validated="false"
break
fi
done < <(printf '%s\n' "$cue_bin_files")
fi
else
- echo ".cue files not compatible with Dreamcast CHD compression" >> "$logs_folder/$chd_validation_log_file"
+ log w ".cue files not compatible with CHD compression"
fi
echo $file_validated
else # If file is a .iso or .gdi
@@ -80,7 +91,7 @@ validate_for_chd() {
echo $file_validated
fi
else
- echo "File type not recognized. Supported file types are .cue, .gdi and .iso" >> "$logs_folder/$chd_validation_log_file"
+ log w "File type not recognized. Supported file types are .cue, .gdi and .iso"
echo $file_validated
fi
}
@@ -93,35 +104,39 @@ cli_compress_single_game() {
read -p "RetroDECK will now attempt to compress your selected game. Press Enter key to continue..."
if [[ ! -z "$file" ]]; then
if [[ -f "$file" ]]; then
- check_system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$")
+ local system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$")
local compatible_compression_format=$(find_compatible_compression_format "$file")
if [[ ! $compatible_compression_format == "none" ]]; then
- echo "$(basename "$file") can be compressed to $compatible_compression_format"
- compress_game "$compatible_compression_format" "$file"
+ log i "$(basename "$file") can be compressed to $compatible_compression_format"
+ compress_game "$compatible_compression_format" "$file" "$system"
if [[ $post_compression_cleanup == [yY] ]]; then # Remove file(s) if requested
- if [[ $(basename "$file") == *".cue" ]]; then
- local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file")
- local file_path=$(dirname "$(realpath "$file")")
- while IFS= read -r line
- do # Remove associated .bin files
- echo "Removing original file "$file_path/$line""
- rm -f "$file_path/$line"
- done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file
- echo "Removing original file $(basename "$file")"
- rm -f "$file"
+ if [[ -f "${file%.*}.$compatible_compression_format" ]]; then
+ if [[ $(basename "$file") == *".cue" ]]; then
+ local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file")
+ local file_path=$(dirname "$(realpath "$file")")
+ while IFS= read -r line
+ do # Remove associated .bin files
+ log i "Removing original file "$file_path/$line""
+ rm -f "$file_path/$line"
+ done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file
+ log i "Removing original file $(basename "$file")"
+ rm -f "$file"
+ else
+ log i "Removing original file $(basename "$file")"
+ rm -f "$file"
+ fi
else
- echo "Removing original file $(basename "$file")"
- rm -f "$file"
+ log w "Compressed version of $(basename "$file") not found, skipping deletion."
fi
fi
else
- echo "$(basename "$file") does not have any compatible compression formats."
+ log w "$(basename "$file") does not have any compatible compression formats."
fi
else
- echo "File not found, please specify the full path to the file to be compressed."
+ log w "File not found, please specify the full path to the file to be compressed."
fi
else
- echo "Please use this command format \"--compress-one \""
+ log i "Please use this command format \"--compress-one \""
fi
}
@@ -149,35 +164,39 @@ cli_compress_all_games() {
do
local compression_candidates=$(find "$roms_folder/$system" -type f -not -iname "*.txt")
if [[ ! -z "$compression_candidates" ]]; then
- echo "Checking files for $system"
+ log i "Checking files for $system"
while IFS= read -r file
do
local compatible_compression_format=$(find_compatible_compression_format "$file")
if [[ ! "$compatible_compression_format" == "none" ]]; then
- echo "$(basename "$file") can be compressed to $compatible_compression_format"
- compress_game "$compatible_compression_format" "$file"
+ log i "$(basename "$file") can be compressed to $compatible_compression_format"
+ compress_game "$compatible_compression_format" "$file" "$system"
if [[ $post_compression_cleanup == [yY] ]]; then # Remove file(s) if requested
- if [[ "$file" == *".cue" ]]; then
- local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file")
- local file_path=$(dirname "$(realpath "$file")")
- while IFS= read -r line
- do # Remove associated .bin files
- echo "Removing original file "$file_path/$line""
- rm -f "$file_path/$line"
- done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file
- echo "Removing original file "$file""
- rm -f $(realpath "$file")
+ if [[ -f "${file%.*}.$compatible_compression_format" ]]; then
+ if [[ "$file" == *".cue" ]]; then
+ local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file")
+ local file_path=$(dirname "$(realpath "$file")")
+ while IFS= read -r line
+ do # Remove associated .bin files
+ log i "Removing original file "$file_path/$line""
+ rm -f "$file_path/$line"
+ done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file
+ log i "Removing original file "$file""
+ rm -f $(realpath "$file")
+ else
+ log i "Removing original file "$file""
+ rm -f $(realpath "$file")
+ fi
else
- echo "Removing original file "$file""
- rm -f $(realpath "$file")
+ log w "Compressed version of $(basename "$file") not found, skipping deletion."
fi
fi
else
- echo "No compatible compression format found for $(basename "$file")"
+ log w "No compatible compression format found for $(basename "$file")"
fi
done < <(printf '%s\n' "$compression_candidates")
else
- echo "No compatible files found for compression in $system"
+ log w "No compatible files found for compression in $system"
fi
done < <(printf '%s\n' "$compressable_systems_list")
}
diff --git a/functions/dialogs.sh b/functions/dialogs.sh
index af005e63..3772c7e9 100644
--- a/functions/dialogs.sh
+++ b/functions/dialogs.sh
@@ -2,6 +2,10 @@
source /app/libexec/functions.sh
+# Dialog colors
+purple="#a864fc"
+blue="#6fbfff"
+
debug_dialog() {
# This function is for displaying commands run by the Configurator without actually running them
# USAGE: debug_dialog "command"
@@ -30,6 +34,7 @@ configurator_process_complete_dialog() {
configurator_generic_dialog() {
# This dialog is for showing temporary messages before another process happens.
# USAGE: configurator_generic_dialog "title text" "info text"
+ log i "Showing a configurator_generic_dialog"
zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "$1" \
@@ -162,6 +167,8 @@ changelog_dialog() {
# The function also accepts "all" as a version, and will print the entire changelog
# USAGE: changelog_dialog "version"
+ log d "Showing changelog dialog"
+
if [[ "$1" == "all" ]]; then
xml sel -t -m "//release" -v "concat('RetroDECK version: ', @version)" -n -v "description" -n $rd_appdata | awk '{$1=$1;print}' | sed -e '/./b' -e :n -e 'N;s/\n$//;tn' > "/var/config/retrodeck/changelog.txt"
@@ -172,8 +179,7 @@ changelog_dialog() {
else
local version_changelog=$(xml sel -t -m "//release[@version='$1']/description" -v . -n $rd_appdata | tr -s '\n' | sed 's/^\s*//')
- echo -e "In RetroDECK version $1, the following changes were made:\n$version_changelog" > "/var/config/retrodeck/changelog-partial.txt"
- "$version_changelog" >> "/var/config/retrodeck/changelog-partial.txt"
+ echo -e "In RetroDECK version $1, the following changes were made:\n$version_changelog" > "/var/config/retrodeck/changelog-partial.txt" 2>/dev/null
zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
@@ -211,17 +217,23 @@ desktop_mode_warning() {
# USAGE: desktop_mode_warning
if [[ $(check_desktop_mode) == "true" && $desktop_mode_warning == "true" ]]; then
+ local message='You appear to be running RetroDECK in the Steam Deck'\''s Desktop mode!\n\nSome functions of RetroDECK may not work properly in Desktop mode, such as the Steam Deck'\''s normal controls.\n\nRetroDECK is best enjoyed in Game mode!\n\nDo you still want to proceed?'
+ log i "Showing message:\n$message"
choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="Yes" --extra-button="No" --extra-button="Never show this again" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Desktop Mode Warning" \
- --text="You appear to be running RetroDECK in the Steam Deck's Desktop mode!\n\nSome functions of RetroDECK may not work properly in Desktop mode, such as the Steam Deck's normal controls.\n\nRetroDECK is best enjoyed in Game mode!\n\nDo you still want to proceed?")
+ --text="$message")
rc=$? # Capture return code, as "Yes" button has no text value
if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked
if [[ $choice == "No" ]]; then
+ log i "Selected: \"No\""
exit 1
elif [[ $choice == "Never show this again" ]]; then
+ log i "Selected: \"Never show this again\""
set_setting_value $rd_conf "desktop_mode_warning" "false" retrodeck "options" # Store desktop mode warning variable for future checks
fi
+ else
+ log i "Selected: \"Yes\""
fi
fi
}
@@ -233,13 +245,17 @@ low_space_warning() {
if [[ $low_space_warning == "true" ]]; then
local used_percent=$(df --output=pcent "$HOME" | tail -1 | tr -d " " | tr -d "%")
if [[ "$used_percent" -ge 90 && -d "$HOME/retrodeck" ]]; then # If there is any RetroDECK data on the main drive to move
+ local message='Your main drive is over 90% full!\n\nIf your drive fills completely this can lead to data loss or system crash.\n\nPlease consider moving some RetroDECK folders to other storage locations using the Configurator.'
+ log i "Showing message:\n$message"
choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="OK" --extra-button="Never show this again" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Low Space Warning" \
- --text="Your main drive is over 90% full!\n\nIf your drive fills completely this can lead to data loss or system crash.\n\nPlease consider moving some RetroDECK folders to other storage locations using the Configurator.")
+ --text="$message")
if [[ $choice == "Never show this again" ]]; then
- set_setting_value $rd_conf "low_space_warning" "false" retrodeck "options" # Store low space warning variable for future checks
+ log i "Selected: \"Never show this again\""
+ set_setting_value $rd_conf "low_space_warning" "false" retrodeck "options" # Store low space warning variable for future checks
fi
fi
+ log i "Selected: \"OK\""
fi
-}
\ No newline at end of file
+}
diff --git a/functions/patching.sh b/functions/framework.sh
similarity index 88%
rename from functions/patching.sh
rename to functions/framework.sh
index 4af54660..92f3b32e 100644
--- a/functions/patching.sh
+++ b/functions/framework.sh
@@ -8,9 +8,11 @@ set_setting_value() {
local setting_value_to_change=$(sed -e 's^\\^\\\\^g;s^`^\\`^g' <<< "$3")
local current_section_name=$(sed -e 's/%/\\%/g' <<< "$5")
+ log d "Setting $setting_name_to_change=$setting_value_to_change in $1"
+
case $4 in
- "retrodeck" | "citra" | "melonds" | "yuzu" )
+ "retrodeck" | "melonds" | "yuzu" | "citra" | "libretro_scummvm" )
if [[ -z $current_section_name ]]; then
sed -i 's^\^'"$setting_name_to_change"'=.*^'"$setting_name_to_change"'='"$setting_value_to_change"'^' "$1"
else
@@ -37,11 +39,21 @@ set_setting_value() {
fi
;;
- "rpcs3" | "vita3k" ) # This does not currently work for settings with a $ in them
- if [[ -z $current_section_name ]]; then
- sed -i 's^\^'"$setting_name_to_change"': .*^'"$setting_name_to_change"': '"$setting_value_to_change"'^' "$1"
- else
- sed -i '\^\['"$current_section_name"'\]^,\^\^'"$setting_name_to_change"'.*^s^\^'"$setting_name_to_change"': .*^'"$setting_name_to_change"': '"$setting_value_to_change"'^' "$1"
+ "rpcs3" | "vita3k" )
+ # This does not currently work for settings with a $ in them
+
+ if [[ "$1" =~ (.ini)$ ]]; then # If this is a RPCS3 .ini file
+ if [[ -z $current_section_name ]]; then
+ sed -i 's^\^'"$setting_name_to_change"'=.*^'"$setting_name_to_change"'='"$setting_value_to_change"'^' "$1"
+ else
+ sed -i '\^\['"$current_section_name"'\]^,\^\^'"$setting_name_to_change"'=^s^\^'"$setting_name_to_change"'=.*^'"$setting_name_to_change"'='"$setting_value_to_change"'^' "$1"
+ fi
+ elif [[ "$1" =~ (.yml)$ ]]; then # If this is an YML-based file
+ if [[ -z $current_section_name ]]; then
+ sed -i 's^\^'"$setting_name_to_change"': .*^'"$setting_name_to_change"': '"$setting_value_to_change"'^' "$1"
+ else
+ sed -i '\^\['"$current_section_name"'\]^,\^\^'"$setting_name_to_change"'.*^s^\^'"$setting_name_to_change"': .*^'"$setting_name_to_change"': '"$setting_value_to_change"'^' "$1"
+ fi
fi
;;
@@ -53,9 +65,15 @@ set_setting_value() {
fi
;;
- "mame" ) # This only works for mame .ini files, not the .cfg XML files
- local mame_current_value=$(get_setting_value $1 "$setting_name_to_change" $4)
- sed -i '\^\^'"$setting_name_to_change"'\s^s^'"$mame_current_value"'^'"$setting_value_to_change"'^' "$1"
+ "mame" )
+ # In this option, $current_section_name is the in the .cfg file.
+
+ local mame_current_value=$(get_setting_value "$1" "$setting_name_to_change" "$4" "$current_section_name")
+ if [[ "$1" =~ (.ini)$ ]]; then # If this is a MAME .ini file
+ sed -i '\^\^'"$setting_name_to_change"'\s^s^'"$mame_current_value"'^'"$setting_value_to_change"'^' "$1"
+ elif [[ "$1" =~ (.cfg)$ ]]; then # If this is an XML-based MAME .cfg file
+ sed -i '\^\^,\^<\/system>^s^'"$mame_current_value"'^'"$setting_value_to_change"'^' "$1"
+ fi
;;
"es_settings" )
@@ -78,7 +96,11 @@ get_setting_name() {
;;
"rpcs3" | "vita3k" )
- echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?:\s?)" | sed -e 's/^[ \t]*//;s^\\ ^ ^g'
+ if [[ "$1" =~ (.ini)$ ]]; then # If this is a RPCS3 .ini file
+ echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?=\s?)" | sed -e 's/^[ \t]*//;s^\\ ^ ^g;s^\\$^^'
+ elif [[ "$1" =~ (.yml)$ ]]; then # If this is an YML-based file
+ echo "$current_setting_line" | grep -o -P "^\s*?.*?(?=\s?:\s?)" | sed -e 's/^[ \t]*//;s^\\ ^ ^g'
+ fi
;;
"mame" ) # This only works for mame .ini files, not the .cfg XML files
@@ -101,7 +123,7 @@ get_setting_value() {
case $3 in
- "retrodeck" | "citra" | "melonds" | "yuzu" ) # For files with this syntax - setting_name=setting_value
+ "retrodeck" | "melonds" | "yuzu" ) # For files with this syntax - setting_name=setting_value
if [[ -z $current_section_name ]]; then
echo $(grep -o -P "(?<=^$current_setting_name=).*" "$1")
else
@@ -141,8 +163,12 @@ get_setting_value() {
fi
;;
- "mame" ) # This only works for mame .ini files, not the .cfg XML files
- echo $(sed -n '\^\^'"$current_setting_name"'\s^p' "$1" | awk '{print $2}')
+ "mame" ) # In this option, $current_section_name is the in the .cfg file.
+ if [[ "$1" =~ (.ini)$ ]]; then # If this is a MAME .ini file
+ echo $(sed -n '\^\^'"$current_setting_name"'\s^p' "$1" | awk '{print $2}')
+ elif [[ "$1" =~ (.cfg)$ ]]; then # If this is an XML-based MAME .cfg file
+ echo $(xml sel -t -v "/mameconfig/system[@name='$current_section_name']//*[@type='$current_setting_name']//*" -v "text()" -n "$1")
+ fi
;;
"es_settings" )
diff --git a/functions/functions.sh b/functions/functions.sh
index ccbdcb91..b8ea9953 100644
--- a/functions/functions.sh
+++ b/functions/functions.sh
@@ -83,6 +83,8 @@ move() {
source_dir="$(echo $1 | sed 's![^/]$!&/!')" # Add trailing slash if it is missing
dest_dir="$(echo $2 | sed 's![^/]$!&/!')" # Add trailing slash if it is missing
+ log d "Moving \"$source_dir\" to \"$dest_dir\""
+
(
rsync -a --remove-source-files --ignore-existing --mkpath "$source_dir" "$dest_dir" # Copy files but don't overwrite conflicts
find "$source_dir" -type d -empty -delete # Cleanup empty folders that were left behind
@@ -100,6 +102,27 @@ move() {
fi
}
+create_dir() {
+ # A simple function that creates a directory checking if is still there while logging the activity
+ # If -d it will delete it prior the creation
+
+ if [[ "$1" == "-d" ]]; then
+ # If "force" flag is provided, delete the directory first
+ shift # Remove the first argument (-f)
+ if [[ -e "$1" ]]; then
+ rm -rf "$1" # Forcefully delete the directory
+ log d "Found \"$1\", deleting it."
+ fi
+ fi
+
+ if [[ ! -d "$1" ]]; then
+ mkdir -p "$1" # Create directory if it doesn't exist
+ log d "Created directory: $1"
+ else
+ log d "Directory \"$1\" already exists, skipping."
+ fi
+}
+
download_file() {
# Function to download file from the Internet, with Zenity progress bar
# USAGE: download_file $source_url $file_dest $file_name
@@ -107,34 +130,14 @@ download_file() {
# file_dest is the destination the file should be in the filesystem, needs filename included!
# file_name is a user-readable file name or description to be put in the Zenity dialog
- # Run wget in the background and redirect the progress to a temporary file
(
- wget "$1" -O "$2" -q --show-progress --progress=dot 2>&1 | sed -n -e 's/^.* \([0-9]*\)%.*$/\1/p' > "/var/cache/tmp/download_progress" &
- wget_pid=$!
-
- progress="0"
- echo "$progress" # Initial progress value. sent to Zenity
- while true; do
- progress=$(tail -n 2 "/var/cache/tmp/download_progress" | head -1) # Read the second-to-last value written to the pipe, to avoid reading data that is half written
- echo "$progress" # Send value to Zenity
- if [[ "$(tail -n 1 "/var/cache/tmp/download_progress")" == "100" ]]; then # Read last line every time to check for download completion
- echo "100"
- break
- fi
- sleep 0.5
- done
-
- # Wait for wget process to finish
- wait "$wget_pid"
+ wget "$1" -O "$2" -q
) |
zenity --progress \
--title="Downloading File" \
--text="Downloading $3..." \
- --percentage=0 \
+ --pulsate \
--auto-close
-
- # Cleanup temp file
- rm -f "/var/cache/tmp/download_progress"
}
update_rd_conf() {
@@ -233,58 +236,60 @@ dir_prep() {
# Call me with:
# dir prep "real dir" "symlink location"
- real="$1"
- symlink="$2"
+ real="$(realpath -s $1)"
+ symlink="$(realpath -s $2)"
- echo -e "\n[DIR PREP]\nMoving $symlink in $real" #DEBUG
+ log d "Preparing directory $symlink in $real"
# if the symlink dir is already a symlink, unlink it first, to prevent recursion
if [ -L "$symlink" ];
then
- echo "$symlink is already a symlink, unlinking to prevent recursives" #DEBUG
+ log d "$symlink is already a symlink, unlinking to prevent recursives"
unlink "$symlink"
fi
# if the dest dir exists we want to backup it
if [ -d "$symlink" ];
then
- echo "$symlink found" #DEBUG
+ log d "$symlink found"
mv -f "$symlink" "$symlink.old"
fi
# if the real dir is already a symlink, unlink it first
if [ -L "$real" ];
then
- echo "$real is already a symlink, unlinking to prevent recursives" #DEBUG
+ log d "$real is already a symlink, unlinking to prevent recursives" #DEBUG
unlink "$real"
fi
# if the real dir doesn't exist we create it
if [ ! -d "$real" ];
then
- echo "$real not found, creating it" #DEBUG
- mkdir -pv "$real"
+ log d "$real not found, creating it" #DEBUG
+ create_dir "$real"
fi
# creating the symlink
- echo "linking $real in $symlink" #DEBUG
- mkdir -pv "$(dirname "$symlink")" # creating the full path except the last folder
+ log d "linking $real in $symlink" #DEBUG
+ create_dir "$(dirname "$symlink")" # creating the full path except the last folder
ln -svf "$real" "$symlink"
# moving everything from the old folder to the new one, delete the old one
if [ -d "$symlink.old" ];
then
- echo "Moving the data from $symlink.old to $real" #DEBUG
+ log d "Moving the data from $symlink.old to $real" #DEBUG
mv -f "$symlink.old"/{.[!.],}* "$real"
- echo "Removing $symlink.old" #DEBUG
+ log d "Removing $symlink.old" #DEBUG
rm -rf "$symlink.old"
fi
- echo -e "$symlink is now $real\n"
+ log i "$symlink is now $real"
}
check_bios_files() {
# This function validates all the BIOS files listed in the $bios_checklist and adds the results to an array called bios_checked_list which can be used elsewhere
+ # There is a "basic" and "expert" mode which outputs different levels of data
+ # USAGE: check_bios_files "mode"
rm -f "$godot_bios_files_checked" # Godot data transfer temp files
touch "$godot_bios_files_checked"
@@ -301,21 +306,33 @@ check_bios_files() {
bios_hash_matched="Yes"
fi
fi
- bios_checked_list=("${bios_checked_list[@]}" "$bios_file" "$bios_system" "$bios_file_found" "$bios_hash_matched" "$bios_desc")
- echo "$bios_file"^"$bios_system"^"$bios_file_found"^"$bios_hash_matched"^"$bios_desc" >> "$godot_bios_files_checked" # Godot data transfer temp file
+ if [[ "$1" == "basic" ]]; then
+ bios_checked_list=("${bios_checked_list[@]}" "$bios_file" "$bios_system" "$bios_file_found" "$bios_hash_matched" "$bios_desc")
+ echo "$bios_file"^"$bios_system"^"$bios_file_found"^"$bios_hash_matched"^"$bios_desc" >> "$godot_bios_files_checked" # Godot data transfer temp file
+ else
+ bios_checked_list=("${bios_checked_list[@]}" "$bios_file" "$bios_system" "$bios_file_found" "$bios_hash_matched" "$bios_desc" "$bios_subdir" "$bios_hash")
+ echo "$bios_file"^"$bios_system"^"$bios_file_found"^"$bios_hash_matched"^"$bios_desc"^"$bios_subdir"^"$bios_hash" >> "$godot_bios_files_checked" # Godot data transfer temp file
+ fi
done < $bios_checklist
}
update_rpcs3_firmware() {
- mkdir -p "$roms_folder/ps3/tmp"
+ create_dir "$roms_folder/ps3/tmp"
chmod 777 "$roms_folder/ps3/tmp"
download_file "$rpcs3_firmware" "$roms_folder/ps3/tmp/PS3UPDAT.PUP" "RPCS3 Firmware"
rpcs3 --installfw "$roms_folder/ps3/tmp/PS3UPDAT.PUP"
rm -rf "$roms_folder/ps3/tmp"
}
+update_vita3k_firmware() {
+ download_file "http://dus01.psv.update.playstation.net/update/psv/image/2022_0209/rel_f2c7b12fe85496ec88a0391b514d6e3b/PSVUPDAT.PUP" "/tmp/PSVUPDAT.PUP" "Vita3K Firmware file: PSVUPDAT.PUP"
+ download_file "http://dus01.psp2.update.playstation.net/update/psp2/image/2019_0924/sd_8b5f60b56c3da8365b973dba570c53a5/PSP2UPDAT.PUP?dest=us" "/tmp/PSP2UPDAT.PUP" "Vita3K Firmware file: PSP2UPDAT.PUP"
+ Vita3K --firmware /tmp/PSVUPDAT.PUP
+ Vita3K --firmware /tmp/PSP2UPDAT.PUP
+}
+
backup_retrodeck_userdata() {
- mkdir -p "$backups_folder"
+ create_dir "$backups_folder"
zip -rq9 "$backups_folder/$(date +"%0m%0d")_retrodeck_userdata.zip" "$saves_folder" "$states_folder" "$bios_folder" "$media_folder" "$themes_folder" "$logs_folder" "$screenshots_folder" "$mods_folder" "$texture_packs_folder" "$borders_folder" > $logs_folder/$(date +"%0m%0d")_backup_log.log
}
@@ -323,7 +340,11 @@ make_name_pretty() {
# This function will take an internal system name (like "gbc") and return a pretty version for user display ("Nintendo GameBoy Color")
# USAGE: make_name_pretty "system name"
local system=$(grep "$1^" "$pretty_system_names_reference_list")
- IFS='^' read -r internal_name pretty_name < <(echo "$system")
+ if [[ ! -z "$system" ]]; then
+ IFS='^' read -r internal_name pretty_name < <(echo "$system")
+ else
+ pretty_name="$system"
+ fi
echo "$pretty_name"
}
@@ -389,22 +410,22 @@ finit_user_options_dialog() {
finit() {
# Force/First init, depending on the situation
- echo "Executing finit"
+ log i "Executing finit"
# Internal or SD Card?
- local finit_dest_choice=$(configurator_destination_choice_dialog "RetroDECK data" "Welcome to the first configuration of RetroDECK.\nThe setup will be quick but please READ CAREFULLY each message in order to avoid misconfigurations.\n\nWhere do you want your RetroDECK data folder to be located?\n\nThis folder will contain all ROMs, BIOSs and scraped data." )
- echo "Choice is $finit_dest_choice"
+ local finit_dest_choice=$(configurator_destination_choice_dialog "RetroDECK data" "Welcome to the first setup of RetroDECK.\nPlease carefully read each message prompted during the installation process to avoid any unwanted misconfigurations.\n\nWhere do you want your RetroDECK data folder to be located?\nIn this location a \"retrodeck\" folder will be created.\nThis is the folder that you will use to contain all your important files, such as your own ROMs, BIOSs, Saves and Scraped Data." )
+ log i "Choice is $finit_dest_choice"
case "$finit_dest_choice" in
- "Back" | "" ) # Back or X button quits
+ "Quit" | "" ) # Back or X button quits
rm -f "$rd_conf" # Cleanup unfinished retrodeck.cfg if first install is interrupted
- echo "Now quitting"
+ log i "Now quitting"
quit_retrodeck
;;
"Internal Storage" ) # Internal
- echo "Internal selected"
+ log i "Internal selected"
rdhome="$HOME/retrodeck"
if [[ -L "$rdhome" ]]; then #Remove old symlink from existing install, if it exists
unlink "$rdhome"
@@ -412,10 +433,10 @@ finit() {
;;
"SD Card" )
- echo "SD Card selected"
+ log i "SD Card selected"
if [ ! -d "$sdcard" ] # SD Card path is not existing
then
- echo "Error: SD card not found"
+ log e "SD card not found"
zenity --error --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \
@@ -428,14 +449,14 @@ finit() {
fi
elif [ ! -w "$sdcard" ] #SD card found but not writable
then
- echo "Error: SD card found but not writable"
+ log e "SD card found but not writable"
zenity --error --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \
--ok-label "Quit" \
--text="SD card was found but is not writable\nThis can happen with cards formatted on PC.\nPlease format the SD card through the Steam Deck's Game Mode and run RetroDECK again."
rm -f "$rd_conf" # Cleanup unfinished retrodeck.cfg if first install is interrupted
- echo "Now quitting"
+ log i "Now quitting"
quit_retrodeck
else
rdhome="$sdcard/retrodeck"
@@ -443,7 +464,7 @@ finit() {
;;
"Custom Location" )
- echo "Custom Location selected"
+ log i "Custom Location selected"
zenity --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \
@@ -469,6 +490,10 @@ finit() {
configurator_generic_dialog "RPCS3 Firmware Install" "You have chosen to install the RPCS3 firmware during the RetroDECK first setup.\n\nThis process will take several minutes and requires network access.\n\nRPCS3 will be launched automatically at the end of the RetroDECK setup process.\nOnce the firmware is installed, please close the emulator to finish the process."
fi
+ if [[ "$finit_options_choices" =~ (vita3k_firmware|Enable All) ]]; then # Additional information on the firmware install process, as the emulator needs to be manually closed
+ configurator_generic_dialog "Vita3K Firmware Install" "You have chosen to install the Vita3K firmware during the RetroDECK first setup.\n\nThis process will take several minutes and requires network access.\n\nVita3K will be launched automatically at the end of the RetroDECK setup process.\nOnce the firmware is installed, please close the emulator to finish the process."
+ fi
+
zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \
--text="RetroDECK will now install the needed files, which can take up to one minute.\nRetroDECK will start once the process is completed.\n\nPress OK to continue."
@@ -484,6 +509,11 @@ finit() {
update_rpcs3_firmware
fi
fi
+ if [[ "$finit_options_choices" =~ (vita3k_firmware|Enable All) ]]; then
+ if [[ $(check_network_connectivity) == "true" ]]; then
+ update_vita3k_firmware
+ fi
+ fi
if [[ "$finit_options_choices" =~ (rd_controller_profile|Enable All) ]]; then
install_retrodeck_controller_profile
fi
@@ -506,11 +536,11 @@ install_retrodeck_starterpack() {
## DOOM section ##
cp /app/retrodeck/extras/doom1.wad "$roms_folder/doom/doom1.wad" # No -f in case the user already has it
- mkdir -p "/var/config/emulationstation/ES-DE/gamelists/doom"
- if [[ ! -f "/var/config/emulationstation/ES-DE/gamelists/doom/gamelist.xml" ]]; then # Don't overwrite an existing gamelist
- cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "/var/config/emulationstation/ES-DE/gamelists/doom/gamelist.xml"
+ create_dir "/var/config/ES-DE/gamelists/doom"
+ if [[ ! -f "/var/config/ES-DE/gamelists/doom/gamelist.xml" ]]; then # Don't overwrite an existing gamelist
+ cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "/var/config/ES-DE/gamelists/doom/gamelist.xml"
fi
- mkdir -p "$media_folder/doom"
+ create_dir "$media_folder/doom"
unzip -oq "/app/retrodeck/rd_prepacks/doom/doom.zip" -d "$media_folder/doom/"
}
@@ -519,10 +549,15 @@ install_retrodeck_controller_profile() {
# NOTE: These files need to be stored in shared locations for Steam, outside of the normal RetroDECK folders and should always be an optional user choice
# BIGGER NOTE: As part of this process, all emulators will need to have their configs hard-reset to match the controller mappings of the profile
# USAGE: install_retrodeck_controller_profile
- if [[ -d "$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/" && -d "$HOME/.steam/steam/controller_base/templates/" ]]; then
- rsync -rlD --mkpath "/app/retrodeck/binding_icons/" "$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/"
- rsync -rlD --mkpath "$emuconfigs/defaults/retrodeck/controller_configs/" "$HOME/.steam/steam/controller_base/templates/"
- # TODO: delete older files Issue#672
+ if [[ -d "$HOME/.steam/steam/controller_base/templates/" || -d "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" ]]; then
+ if [[ -d "$HOME/.steam/steam/controller_base/templates/" ]]; then # If a normal binary Steam install exists
+ rsync -rlD --mkpath "/app/retrodeck/binding_icons/" "$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/"
+ rsync -rlD --mkpath "$emuconfigs/defaults/retrodeck/controller_configs/" "$HOME/.steam/steam/controller_base/templates/"
+ fi
+ if [[ -d "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" ]]; then # If a Flatpak Steam install exists
+ rsync -rlD --mkpath "/app/retrodeck/binding_icons/" "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/"
+ rsync -rlD --mkpath "$emuconfigs/defaults/retrodeck/controller_configs/" "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/"
+ fi
else
configurator_generic_dialog "RetroDECK Controller Profile Install" "The target directories for the controller profile do not exist.\n\nThis may happen if you do not have Steam installed or the location is does not have permission to be read."
fi
@@ -539,8 +574,11 @@ update_splashscreens() {
# This script will purge any existing ES graphics and reload them from RO space into somewhere ES will look for it
# USAGE: update_splashscreens
- rm -rf /var/config/emulationstation/ES-DE/resources/graphics
- rsync -rlD --mkpath "/app/retrodeck/graphics/" "/var/config/emulationstation/ES-DE/resources/graphics/"
+ log i "Updating splash screen"
+
+ rm -rf /var/config/ES-DE/resources/graphics
+ rsync -rlD --mkpath "/app/retrodeck/graphics/" "/var/config/ES-DE/resources/graphics/"
+
}
deploy_helper_files() {
@@ -582,11 +620,113 @@ easter_eggs() {
cp -f "$new_splash_file" "$current_splash_file" # Deploy assigned splash screen
}
+ponzu() {
+ # This function is used to extract some specific appimages
+ # Check if any of the specified files exist
+ # If RetroDECK is reset Ponzu must re-cooked
+
+ log d "Checking for Ponzu"
+
+ local tmp_folder="/tmp/extracted"
+ local ponzu_files=("$rdhome"/ponzu/Citra*.AppImage "$rdhome"/ponzu/citra*.AppImage "$rdhome"/ponzu/Yuzu*.AppImage "$rdhome"/ponzu/yuzu*.AppImage)
+ local data_dir
+ local appimage
+ local executable
+
+ # if the binaries are found, ponzu should be set as true into the retrodeck config
+ if [ -f "/var/data/ponzu/Citra/bin/citra-qt" ]; then
+ log d "Citra binaries has already been installed, checking for updates and forcing the setting as true."
+ set_setting_value $rd_conf "akai_ponzu" "true" retrodeck "options"
+ fi
+ if [ -f "/var/data/ponzu/Yuzu/bin/yuzu" ]; then
+ log d "Yuzu binaries has already been installed, checking for updates and forcing the setting as true."
+ set_setting_value $rd_conf "kiroi_ponzu" "true" retrodeck "options"
+ fi
+
+ # Loop through all ponzu files
+ for ponzu_file in "${ponzu_files[@]}"; do
+ # Check if the current ponzu file exists
+ if [ -f "$ponzu_file" ]; then
+ if [[ "$ponzu_file" == *itra* ]]; then
+ log i "Found akai ponzu! Elaborating it"
+ data_dir="/var/data/ponzu/Citra"
+ local message="Akai ponzu is served, enjoy"
+ elif [[ "$ponzu_file" == *uzu* ]]; then
+ log i "Found kiroi ponzu! Elaborating it"
+ data_dir="/var/data/ponzu/Yuzu"
+ local message="Kiroi ponzu is served, enjoy"
+ else
+ log e "AppImage not recognized, not a ponzu ingredient!"
+ exit 1
+ fi
+ appimage="$ponzu_file"
+ chmod +x "$ponzu_file"
+ create_dir "$data_dir"
+ log d "Moving AppImage in \"$data_dir\""
+ mv "$appimage" "$data_dir"
+ cd "$data_dir"
+ local filename=$(basename "$ponzu_file")
+ log d "Setting appimage=$data_dir/$filename"
+ appimage="$data_dir/$filename"
+ log d "Extracting AppImage"
+ "$appimage" --appimage-extract
+ create_dir "$tmp_folder"
+ log d "Cleaning up"
+ cp -r squashfs-root/* "$tmp_folder"
+ rm -rf *
+ if [[ "$ponzu_file" == *itra* ]]; then
+ mv "$tmp_folder/usr/"** .
+ executable="$data_dir/bin/citra"
+ log d "Making $executable and $executable-qt executable"
+ chmod +x "$executable"
+ chmod +x "$executable-qt"
+ prepare_component "reset" "citra"
+ set_setting_value $rd_conf "akai_ponzu" "true" retrodeck "options"
+ elif [[ "$ponzu_file" == *uzu* ]]; then
+ mv "$tmp_folder/usr/"** .
+ executable="$data_dir/bin/yuzu"
+ log d "Making $executable executable"
+ chmod +x "$executable"
+ prepare_component "reset" "yuzu"
+ set_setting_value $rd_conf "kiroi_ponzu" "true" retrodeck "options"
+ fi
+
+ cd -
+ log i "$message"
+ rm -rf "$tmp_folder"
+ fi
+ done
+ rm -rf "$rdhome/ponzu"
+}
+
+ponzu_remove(){
+
+ # Call me with yuzu or citra and I will remove them
+
+ if [[ "$1" == "citra" ]]; then
+ if [[ $(configurator_generic_question_dialog "Ponzu - Remove Citra" "Do you really want to remove Citra binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then
+ log i "Ponzu: removing Citra"
+ rm -rf "/var/data/ponzu/Citra"
+ set_setting_value $rd_conf "akai_ponzu" "false" retrodeck "options"
+ configurator_generic_dialog "Ponzu - Remove Citra" "Done, Citra is now removed from RetroDECK"
+ fi
+ elif [[ "$1" == "yuzu" ]]; then
+ if [[ $(configurator_generic_question_dialog "Ponzu - Remove Yuzu" "Do you really want to remove Yuzu binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then
+ log i "Ponzu: removing Yuzu"
+ rm -rf "/var/data/ponzu/Yuzu"
+ set_setting_value $rd_conf "kiroi_ponzu" "false" retrodeck "options"
+ configurator_generic_dialog "Ponzu - Remove Yuzu" "Done, Yuzu is now removed from RetroDECK"
+ fi
+ else
+ log e "Ponzu: \"$1\" is not a vaild choice for removal, quitting"
+ fi
+ configurator_retrodeck_tools_dialog
+}
+
# TODO: this function is not yet used
branch_selector() {
- # Fetch branches from GitHub API excluding "main"
+ log d "Fetch branches from GitHub API excluding \"main\""
branches=$(curl -s https://api.github.com/repos/XargonWan/RetroDECK/branches | grep '"name":' | awk -F '"' '$4 != "main" {print $4}')
- # TODO: logging - Fetching branches from GitHub API
# Create an array to store branch names
branch_array=()
@@ -624,7 +764,7 @@ branch_selector() {
configurator_generic_dialog "RetroDECK Online Update" "The update process may take several minutes.\n\nAfter the update is complete, RetroDECK will close. When you run it again you will be using the latest version."
(
local desired_flatpak_file=$(curl --silent $flatpak_file_url | grep '"browser_download_url":' | sed -E 's/.*"([^"]+)".*/\1/')
- mkdir -p "$rdhome/RetroDECK_Updates"
+ create_dir "$rdhome/RetroDECK_Updates"
wget -P "$rdhome/RetroDECK_Updates" $desired_flatpak_file
flatpak-spawn --host flatpak remove --noninteractive -y net.retrodeck.retrodeck # Remove current version before installing new one, to avoid duplicates
flatpak-spawn --host flatpak install --user --bundle --noninteractive -y "$rdhome/RetroDECK_Updates/RetroDECK-cooker.flatpak"
@@ -643,13 +783,16 @@ branch_selector() {
}
quit_retrodeck() {
- pkill -f retrodeck
- pkill -f emulationstation
+ log i "Quitting ES-DE"
+ pkill -f "es-de"
+ log i "Shutting down RetroDECK's framework"
+ pkill -f "retrodeck"
+ log i "See you next time"
}
start_retrodeck() {
easter_eggs # Check if today has a surprise splashscreen and load it if so
- # normal startup
- echo "Starting RetroDECK v$version"
- emulationstation --home /var/config/emulationstation
+ ponzu
+ log i "Starting RetroDECK v$version"
+ es-de
}
diff --git a/functions/global.sh b/functions/global.sh
index d9d67121..cb332dd3 100644
--- a/functions/global.sh
+++ b/functions/global.sh
@@ -6,10 +6,11 @@ source /app/libexec/050_save_migration.sh
source /app/libexec/checks.sh
source /app/libexec/compression.sh
source /app/libexec/dialogs.sh
+source /app/libexec/logger.sh
source /app/libexec/functions.sh
source /app/libexec/game_downloader.sh
source /app/libexec/multi_user.sh
-source /app/libexec/patching.sh
+source /app/libexec/framework.sh
source /app/libexec/post_update.sh
source /app/libexec/prepare_component.sh
source /app/libexec/presets.sh
@@ -17,6 +18,7 @@ source /app/libexec/presets.sh
# Static variables
rd_conf="/var/config/retrodeck/retrodeck.cfg" # RetroDECK config file path
rd_conf_backup="/var/config/retrodeck/retrodeck.bak" # Backup of RetroDECK config file from update
+rd_logs_folder="/var/config/retrodeck/logs" # Static location to write all RetroDECK-related logs
emuconfigs="/app/retrodeck/emu-configs" # folder with all the default emulator configs
rd_defaults="$emuconfigs/defaults/retrodeck/retrodeck.cfg" # A default RetroDECK config file
rd_update_patch="/var/config/retrodeck/rd_update.patch" # A static location for the temporary patch file used during retrodeck.cfg updates
@@ -26,13 +28,13 @@ zip_compressable_extensions="$emuconfigs/defaults/retrodeck/reference_lists/zip_
easter_egg_checklist="$emuconfigs/defaults/retrodeck/reference_lists/easter_egg_checklist.cfg" # A config file listing days and times when special splash screens should show up
input_validation="$emuconfigs/defaults/retrodeck/reference_lists/input_validation.cfg" # A config file listing valid CLI inputs
finit_options_list="$emuconfigs/defaults/retrodeck/reference_lists/finit_options_list.cfg" # A config file listing available optional installs during finit
-splashscreen_dir="/var/config/emulationstation/ES-DE/resources/graphics/extra_splashes" # The default location of extra splash screens
-current_splash_file="/var/config/emulationstation/ES-DE/resources/graphics/splash.svg" # The active splash file that will be shown on boot
-default_splash_file="/var/config/emulationstation/ES-DE/resources/graphics/splash-orig.svg" # The default RetroDECK splash screen
+splashscreen_dir="/var/config/ES-DE/resources/graphics/extra_splashes" # The default location of extra splash screens
+current_splash_file="/var/config/ES-DE/resources/graphics/splash.svg" # The active splash file that will be shown on boot
+default_splash_file="/var/config/ES-DE/resources/graphics/splash-orig.svg" # The default RetroDECK splash screen
multi_user_emulator_config_dirs="$emuconfigs/defaults/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg" # A list of emulator config folders that can be safely linked/unlinked entirely in multi-user mode
-rd_es_themes="/app/share/emulationstation/themes" # The directory where themes packaged with RetroDECK are stored
-lockfile="/var/config/retrodeck/.lock" # where the lockfile is located
-default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path
+rd_es_themes="/app/share/es-de/themes" # The directory where themes packaged with RetroDECK are stored
+lockfile="/var/config/retrodeck/.lock" # Where the lockfile is located
+default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path # A static location for RetroDECK logs to be written
hard_version="$(cat '/app/retrodeck/version')" # hardcoded version (in the readonly filesystem)
rd_repo="https://github.com/XargonWan/RetroDECK" # The URL of the main RetroDECK GitHub repo
es_themes_list="https://gitlab.com/es-de/themes/themes-list/-/raw/master/themes.json" # The URL of the ES-DE 2.0 themes list
@@ -50,25 +52,28 @@ pretty_system_names_reference_list="$emuconfigs/defaults/retrodeck/reference_lis
# Godot data transfer temp files
-godot_bios_files_checked="var/config/retrodeck/godot/godot_bios_files_checked.tmp"
+godot_bios_files_checked="/var/config/retrodeck/godot/godot_bios_files_checked.tmp"
# Config files for emulators with single config files
-citraconf="/var/config/citra-emu/qt-config.ini"
duckstationconf="/var/config/duckstation/settings.ini"
melondsconf="/var/config/melonDS/melonDS.ini"
ryujinxconf="/var/config/Ryujinx/Config.json"
xemuconf="/var/config/xemu/xemu.toml"
yuzuconf="/var/config/yuzu/qt-config.ini"
+citraconf="/var/config/citra-emu/qt-config.ini"
# ES-DE config files
-es_settings="/var/config/emulationstation/ES-DE/es_settings.xml"
+export ESDE_APPDATA_DIR="/var/config/ES-DE"
+es_settings="/var/config/ES-DE/settings/es_settings.xml"
+es_source_logs="/var/config/ES-DE/logs"
# RetroArch config files
raconf="/var/config/retroarch/retroarch.cfg"
ra_core_conf="/var/config/retroarch/retroarch-core-options.cfg"
+ra_scummvm_conf="/var/config/retroarch/system/scummvm.ini"
# CEMU config files
@@ -113,6 +118,20 @@ rpcs3vfsconf="/var/config/rpcs3/vfs.yml"
vita3kconf="/var/data/Vita3K/config.yml"
vita3kusrconfdir="$bios_folder/Vita3K/Vita3K"
+# MAME-SA config files
+
+mameconf="/var/config/mame/ini/mame.ini"
+mameuiconf="/var/config/mame/ini/ui.ini"
+mamedefconf="/var/config/mame/cfg/default.cfg"
+
+# Initialize logging location if it doesn't exist, before anything else happens
+if [ ! -d "$rd_logs_folder" ]; then
+ create_dir "$rd_logs_folder"
+fi
+if [[ ! -d "$rd_logs_folder/ES-DE" ]]; then
+ dir_prep "$rd_logs_folder/ES-DE" "$es_source_logs"
+fi
+
# We moved the lockfile in /var/config/retrodeck in order to solve issue #53 - Remove in a few versions
if [[ -f "$HOME/retrodeck/.lock" ]]; then
mv "$HOME/retrodeck/.lock" $lockfile
@@ -120,15 +139,14 @@ fi
# If there is no config file I initalize the file with the the default values
if [[ ! -f "$rd_conf" ]]; then
- mkdir -p /var/config/retrodeck
- echo "RetroDECK config file not found in $rd_conf"
- echo "Initializing"
+ log w "RetroDECK config file not found in $rd_conf"
+ log i "Initializing"
# if we are here means that the we are in a new installation, so the version is valorized with the hardcoded one
# Initializing the variables
if [[ -z "$version" ]]; then
if [[ -f "$lockfile" ]]; then
if [[ $(cat $lockfile) == *"0.4."* ]] || [[ $(cat $lockfile) == *"0.3."* ]] || [[ $(cat $lockfile) == *"0.2."* ]] || [[ $(cat $lockfile) == *"0.1."* ]]; then # If the previous version is very out of date, pre-rd_conf
- echo "Running version workaround"
+ log d "Running version workaround"
version=$(cat $lockfile)
fi
else
@@ -138,8 +156,8 @@ if [[ ! -f "$rd_conf" ]]; then
# Check if SD card path has changed from SteamOS update
if [[ ! -d "$default_sd" && "$(ls -A /run/media/deck/)" ]]; then
- if [[ $(find media/deck/* -maxdepth 0 -type d -print | wc -l) -eq 1 ]]; then # If there is only one SD card found in the new SteamOS 3.5 location, assign it as the default
- default_sd="$(find media/deck/* -maxdepth 0 -type d -print)"
+ if [[ $(find /run/media/deck/* -maxdepth 0 -type d -print | wc -l) -eq 1 ]]; then # If there is only one SD card found in the new SteamOS 3.5 location, assign it as the default
+ default_sd="$(find /run/media/deck/* -maxdepth 0 -type d -print)"
else # If the default legacy path cannot be found, and there are multiple entries in the new Steam OS 3.5 SD card path, let the user pick which one to use
configurator_generic_dialog "RetroDECK Setup" "The SD card was not found in the default location, and multiple drives were detected.\nPlease browse to the location of the desired SD card.\n\nIf you are not using an SD card, please click \"Cancel\"."
default_sd="$(directory_browse "SD Card Location")"
@@ -150,23 +168,22 @@ if [[ ! -f "$rd_conf" ]]; then
set_setting_value $rd_conf "version" "$version" retrodeck # Set current version for new installs
set_setting_value $rd_conf "sdcard" "$default_sd" retrodeck "paths" # Set SD card location if default path has changed
- if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build
+ if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR-" <<< "$hard_version"; then # If newly-installed version is a "cooker" or PR build
set_setting_value $rd_conf "update_repo" "RetroDECK-cooker" retrodeck "options"
set_setting_value $rd_conf "update_check" "true" retrodeck "options"
set_setting_value $rd_conf "developer_options" "true" retrodeck "options"
fi
- echo "Setting config file permissions"
+ log i "Setting config file permissions"
chmod +rw $rd_conf
- echo "RetroDECK config file initialized. Contents:"
- echo
- cat $rd_conf
+ log i "RetroDECK config file initialized. Contents:\n\n$(cat $rd_conf)\n"
conf_read # Load new variables into memory
+ #tmplog_merger # This function is tempry(?) removed
# If the config file is existing i just read the variables
else
- echo "Found RetroDECK config file in $rd_conf"
- echo "Loading it"
+ log i "Found RetroDECK config file in $rd_conf"
+ log i "Loading it"
if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build
set_setting_value $rd_conf "update_repo" "RetroDECK-cooker" retrodeck "options"
@@ -175,6 +192,7 @@ else
fi
conf_read
+ #tmplog_merger # This function is tempry(?) removed
# Verify rdhome is where it is supposed to be.
if [[ ! -d "$rdhome" ]]; then
@@ -183,6 +201,7 @@ else
new_home_path=$(directory_browse "RetroDECK folder location")
set_setting_value $rd_conf "rdhome" "$new_home_path" retrodeck "paths"
conf_read
+ #tmplog_merger # This function is tempry(?) removed
prepare_component "retrodeck" "postmove"
prepare_component "all" "postmove"
conf_write
@@ -192,3 +211,5 @@ else
backups_folder="$rdhome/backups" # A standard location for backup file storage
multi_user_data_folder="$rdhome/multi-user-data" # The default location of multi-user environment profiles
fi
+
+logs_folder="$rdhome/logs" # The path of the logs folder, here we collect all the logs
diff --git a/functions/logger.sh b/functions/logger.sh
new file mode 100755
index 00000000..d37dafb6
--- /dev/null
+++ b/functions/logger.sh
@@ -0,0 +1,98 @@
+# SORRY, I WILL CLEAN UP THIS
+# -Xargon
+
+# This script provides a logging function 'log' that can be sourced in other scripts.
+# It logs messages to both the terminal and a specified logfile, allowing different log levels.
+# The log function takes three parameters: log level, log message, and optionally the logfile. If no logfile is specified, it writes to retrodeck/logs/retrodeck.log
+
+# Type of log messages:
+# log d - debug message: maybe in the future we can decide to hide them in main builds or if an option is toggled
+# log i - normal informational message
+# log w - waring: something is not expected but it's not a big deal
+# log e - error: something broke
+
+# Example usage:
+# log w "foo" -> logs a warning with message foo in the default log file retrodeck/logs/retrodeck.log
+# log e "bar" -> logs an error with message bar in the default log file retrodeck/logs/retrodeck.log
+# log i "par" rekku.log -> logs an information with message in the specified log file inside the logs folder retrodeck/logs/rekku.log
+
+log() {
+
+ local level="$1"
+ local message="$2"
+ local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S.%3N])"
+ local colorize_terminal
+
+ # Use specified logfile or default to retrodeck.log
+ local logfile
+ if [ -n "$3" ]; then
+ logfile="$3"
+ else
+ logfile="$rd_logs_folder/retrodeck.log"
+ fi
+
+ # Check if the shell is sh (not bash or zsh) to avoid colorization
+ if [ "${SHELL##*/}" = "sh" ]; then
+ colorize_terminal=false
+ else
+ colorize_terminal=true
+ fi
+
+ case "$level" in
+ w)
+ if [ "$colorize_terminal" = true ]; then
+ # Warning (yellow) for terminal
+ colored_message="\e[33m[WARN] $message\e[0m"
+ else
+ # Warning (no color for sh) for terminal
+ colored_message="$timestamp [WARN] $message"
+ fi
+ # Write to log file without colorization
+ log_message="$timestamp [WARN] $message"
+ ;;
+ e)
+ if [ "$colorize_terminal" = true ]; then
+ # Error (red) for terminal
+ colored_message="\e[31m[ERROR] $message\e[0m"
+ else
+ # Error (no color for sh) for terminal
+ colored_message="$timestamp [ERROR] $message"
+ fi
+ # Write to log file without colorization
+ log_message="$timestamp [ERROR] $message"
+ ;;
+ i)
+ # Write to log file without colorization for info message
+ log_message="$timestamp [INFO] $message"
+ colored_message=$log_message
+ ;;
+ d)
+ if [ "$colorize_terminal" = true ]; then
+ # Debug (green) for terminal
+ colored_message="\e[32m[DEBUG] $message\e[0m"
+ else
+ # Debug (no color for sh) for terminal
+ colored_message="$timestamp [DEBUG] $message"
+ fi
+ # Write to log file without colorization
+ log_message="$timestamp [DEBUG] $message"
+ ;;
+ *)
+ # Default (no color for other shells) for terminal
+ colored_message="$timestamp $message"
+ # Write to log file without colorization
+ log_message="$timestamp $message"
+ ;;
+ esac
+
+ # Display the message in the terminal
+ echo -e "$colored_message"
+
+ # Write the log message to the log file
+ if [ ! -f "$logfile" ]; then
+ echo "$timestamp [WARN] Log file not found in \"$logfile\", creating it"
+ touch "$logfile"
+ fi
+ echo "$log_message" >> "$logfile"
+
+}
diff --git a/functions/multi_user.sh b/functions/multi_user.sh
index 6a744814..10fced39 100644
--- a/functions/multi_user.sh
+++ b/functions/multi_user.sh
@@ -43,7 +43,7 @@ multi_user_enable_multi_user_mode() {
if [[ -d "$multi_user_data_folder" && $(ls -1 "$multi_user_data_folder" | wc -l) -gt 0 ]]; then # If multi-user data folder exists from prior use and is not empty
if [[ -d "$multi_user_data_folder/$SteamAppUser" ]]; then # Current user has an existing save folder
configurator_generic_dialog "RetroDECK Multi-User Mode" "The current user $SteamAppUser has an existing folder in the multi-user data folder.\n\nThe saves here are likely older than the ones currently used by RetroDECK.\n\nThe old saves will be backed up to $backups_folder and the current saves will be loaded into the multi-user data folder."
- mkdir -p "$backups_folder"
+ create_dir "$backups_folder"
tar -C "$multi_user_data_folder" -cahf "$backups_folder/multi-user-backup_$SteamAppUser_$(date +"%Y_%m_%d").zip" "$SteamAppUser"
rm -rf "$multi_user_data_folder/$SteamAppUser" # Remove stale data after backup
fi
@@ -162,18 +162,18 @@ multi_user_return_to_single_user() {
# XEMU one-offs, because it stores its config in /var/data, not /var/config like everything else
unlink "/var/config/xemu"
unlink "/var/data/xemu/xemu"
- mkdir -p "/var/config/xemu"
+ create_dir "/var/config/xemu"
mv -f "$multi_user_data_folder/$single_user/config/xemu"/{.[!.],}* "/var/config/xemu"
dir_prep "/var/config/xemu" "/var/data/xemu/xemu"
- mkdir -p "$saves_folder"
- mkdir -p "$states_folder"
+ create_dir "$saves_folder"
+ create_dir "$states_folder"
mv -f "$multi_user_data_folder/$single_user/saves"/{.[!.],}* "$saves_folder"
mv -f "$multi_user_data_folder/$single_user/states"/{.[!.],}* "$states_folder"
for emu_conf in $(find "$multi_user_data_folder/$single_user/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n')
do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
unlink "/var/config/$emu_conf"
- mkdir -p "/var/config/$emu_conf"
+ create_dir "/var/config/$emu_conf"
mv -f "$multi_user_data_folder/$single_user/config/$emu_conf"/{.[!.],}* "/var/config/$emu_conf"
fi
done
@@ -187,11 +187,11 @@ multi_user_setup_new_user() {
unlink "$states_folder"
dir_prep "$multi_user_data_folder/$SteamAppUser/saves" "$saves_folder"
dir_prep "$multi_user_data_folder/$SteamAppUser/states" "$states_folder"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/retrodeck"
+ create_dir "$multi_user_data_folder/$SteamAppUser/config/retrodeck"
cp -L "$rd_conf" "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" # Copy existing rd_conf file for new user.
rm -f "$rd_conf"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/retroarch"
+ create_dir "$multi_user_data_folder/$SteamAppUser/config/retroarch"
if [[ ! -L "/var/config/retroarch/retroarch.cfg" ]]; then
mv "/var/config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg"
mv "/var/config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg"
diff --git a/functions/post_update.sh b/functions/post_update.sh
index ec9acee5..3dcc012b 100644
--- a/functions/post_update.sh
+++ b/functions/post_update.sh
@@ -3,18 +3,16 @@
post_update() {
# post update script
- echo "Executing post-update script"
+ log i "Executing post-update script"
- local prev_version=$(sed -e 's/[\.a-z]//g' <<< $version)
-
- if [[ $prev_version -le "050" ]]; then # If updating from prior to save sorting change at 0.5.0b
+ if [[ $(check_version_is_older_than "0.5.0b") == "true" ]]; then # If updating from prior to save sorting change at 0.5.0b
save_migration
fi
# Everything within the following ( ) will happen behind the Zenity dialog. The save migration was a long process so it has its own individual dialogs.
(
- if [[ $prev_version -le "062" ]]; then
+ if [[ $(check_version_is_older_than "0.6.2b") == "true" ]]; then
# In version 0.6.2b, the following changes were made that required config file updates/reset:
# - Primehack preconfiguration completely redone. "Stop emulation" hotkey set to Start+Select, Xbox and Nintendo keymap profiles were created, Xbox set as default.
# - Duckstation save and state locations were dir_prep'd to the rdhome/save and /state folders, which was not previously done. Much safer now!
@@ -31,7 +29,7 @@ post_update() {
dir_prep "$roms_folder/pico8" "$bios_folder/pico-8/carts" # Symlink default game location to RD roms for cleanliness (this location is overridden anyway by the --root_path launch argument anyway)
dir_prep "$bios_folder/pico-8/cdata" "$saves_folder/pico-8" # PICO-8 saves folder
fi
- if [[ $prev_version -le "063" ]]; then
+ if [[ $(check_version_is_older_than "0.6.3b") == "true" ]]; then
# In version 0.6.3b, the following changes were made that required config file updates/reset:
# - Put Dolphin and Primehack save states in different folders inside $rd_home/states
# - Fix symlink to hard-coded PICO-8 config folder (dir_prep doesn't like ~)
@@ -53,7 +51,7 @@ post_update() {
# Remove unneeded tools folder, as location has changed to RO space
rm -rfv /var/config/retrodeck/tools/
fi
- if [[ $prev_version -le "064" ]]; then
+ if [[ $(check_version_is_older_than "0.6.4b") == "true" ]]; then
# In version 0.6.4b, the following changes were made:
# Changed settings in Primehack: The audio output was not selected by default, default AR was also incorrect.
# Changed settings in Duckstation and PCSX2: The "ask on exit" was disabled and "save on exit" was enabled.
@@ -61,13 +59,13 @@ post_update() {
deploy_multi_patch "emu-configs/patches/updates/064b_update.patch"
fi
- if [[ $prev_version -le "065" ]]; then
+ if [[ $(check_version_is_older_than "0.6.5b") == "true" ]]; then
# In version 0.6.5b, the following changes were made:
# Change Yuzu GPU accuracy to normal for better performance
set_setting_value $yuzuconf "gpu_accuracy" "0" "yuzu" "Renderer"
fi
- if [[ $prev_version -le "070" ]]; then
+ if [[ $(check_version_is_older_than "0.7.0b") == "true" ]]; then
# In version 0.7.0b, the following changes were made that required config file updates/reset or other changes to the filesystem:
# - Update retrodeck.cfg and set new paths to $rdhome by default
# - Update PCSX2 and Duckstation configs to latest templates (to accomadate RetroAchievements feature) and move Duckstation config folder from /var/data to /var/config
@@ -106,9 +104,9 @@ post_update() {
deploy_single_patch "$emuconfigs/duckstation/settings.ini" "/var/config/duckstation/duckstation-cheevos-upgrade.patch" "$duckstationconf"
rm -f "/var/config/duckstation/duckstation-cheevos-upgrade.patch"
- mkdir -p "$mods_folder"
- mkdir -p "$texture_packs_folder"
- mkdir -p "$borders_folder"
+ create_dir "$mods_folder"
+ create_dir "$texture_packs_folder"
+ create_dir "$borders_folder"
dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods"
dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures"
@@ -144,13 +142,13 @@ post_update() {
rm "$roms_folder/ps3/emudir"
configurator_generic_dialog "RetroDECK 0.7.0b Upgrade" "As part of this update and due to a RPCS3 config upgrade, the files that used to exist at\n\n~/retrodeck/roms/ps3/emudir\n\nare now located at\n\n~/retrodeck/bios/rpcs3.\nYour existing files have been moved automatically."
fi
- mkdir -p "$bios_folder/rpcs3/dev_hdd0"
- mkdir -p "$bios_folder/rpcs3/dev_hdd1"
- mkdir -p "$bios_folder/rpcs3/dev_flash"
- mkdir -p "$bios_folder/rpcs3/dev_flash2"
- mkdir -p "$bios_folder/rpcs3/dev_flash3"
- mkdir -p "$bios_folder/rpcs3/dev_bdvd"
- mkdir -p "$bios_folder/rpcs3/dev_usb000"
+ create_dir "$bios_folder/rpcs3/dev_hdd0"
+ create_dir "$bios_folder/rpcs3/dev_hdd1"
+ create_dir "$bios_folder/rpcs3/dev_flash"
+ create_dir "$bios_folder/rpcs3/dev_flash2"
+ create_dir "$bios_folder/rpcs3/dev_flash3"
+ create_dir "$bios_folder/rpcs3/dev_bdvd"
+ create_dir "$bios_folder/rpcs3/dev_usb000"
dir_prep "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" "$saves_folder/ps3/rpcs3"
set_setting_value $es_settings "ApplicationUpdaterFrequency" "never" "es_settings"
@@ -158,7 +156,7 @@ post_update() {
if [[ -f "$saves_folder/duckstation/shared_card_1.mcd" || -f "$saves_folder/duckstation/shared_card_2.mcd" ]]; then
configurator_generic_dialog "RetroDECK 0.7.0b Upgrade" "As part of this update, the location of saves and states for Duckstation has been changed.\n\nYour files will be moved automatically, and can now be found at\n\n~.../saves/psx/duckstation/memcards/\nand\n~.../states/psx/duckstation/"
fi
- mkdir -p "$saves_folder/psx/duckstation/memcards"
+ create_dir "$saves_folder/psx/duckstation/memcards"
mv "$saves_folder/duckstation/"* "$saves_folder/psx/duckstation/memcards/"
rmdir "$saves_folder/duckstation" # File-safe folder cleanup
unlink "/var/config/duckstation/memcards"
@@ -166,7 +164,7 @@ post_update() {
set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
- mkdir -p "$states_folder/psx"
+ create_dir "$states_folder/psx"
mv -t "$states_folder/psx/" "$states_folder/duckstation"
unlink "/var/config/duckstation/savestates"
dir_prep "$states_folder/psx/duckstation" "/var/config/duckstation/savestates"
@@ -222,32 +220,139 @@ post_update() {
prepare_component "reset" "all"
fi
fi
- if [[ $prev_version -le "071" ]]; then
+ if [[ $(check_version_is_older_than "0.7.1b") == "true" ]]; then
# In version 0.7.1b, the following changes were made that required config file updates/reset or other changes to the filesystem:
# - Force update PPSSPP standalone keybinds for L/R.
set_setting_value "$ppssppcontrolsconf" "L" "1-45,10-193" "ppsspp" "ControlMapping"
set_setting_value "$ppssppcontrolsconf" "R" "1-51,10-192" "ppsspp" "ControlMapping"
fi
- if [[ $prev_version -le "073" ]]; then
+ if [[ $(check_version_is_older_than "0.7.3b") == "true" ]]; then
# In version 0.7.3b, there was a bug that prevented the correct creations of the roms/system folders, so we force recreate them.
emulationstation --home /var/config/emulationstation --create-system-dirs
fi
- if [[ $prev_version -le "080" ]]; then
- # In version 0.8.0b, the following changes were made that required config file updates/reset or other changes to the filesystem:
- # - Remove RetroDECK controller profile from existing template location TODO
- # - Determine if Steam is installed via normal desktop application / Flatpak / SteamOS TODO
- # - Install RetroDECK controller profile in desired location TODO
- # - Change section name in retrodeck.cfg for ABXY button swap preset
+ if [[ $(check_version_is_older_than "0.8.0b") == "true" ]]; then
+ log i "In version 0.8.0b, the following changes were made that required config file updates/reset or other changes to the filesystem:"
+ log i "- Remove RetroDECK controller profile from existing template location"
+ log i "- Change section name in retrodeck.cfg for ABXY button swap preset"
+ log i "- Force disable global rewind in RA in prep for preset system"
+ log i "- The following components are been added and need to be initialized: es-de 3.0, MAME-SA, Vita3K, GZDoom"
+
+
+ # Removing old controller configs
+ local controller_configs_path="$HOME/.steam/steam/controller_base/templates"
+ local controller_configs=(
+ "$controller_configs_path/RetroDECK_controller_config.vdf"
+ "$controller_configs_path/RetroDECK_controller_generic_standard.vdf"
+ "$controller_configs_path/RetroDECK_controller_ps3_dualshock3.vdf"
+ "$controller_configs_path/RetroDECK_controller_ps4_dualshock4.vdf"
+ "$controller_configs_path/RetroDECK_controller_ps5_dualsense.vdf"
+ "$controller_configs_path/RetroDECK_controller_steam_controller_gordon.vdf"
+ "$controller_configs_path/RetroDECK_controller_neptune.vdf"
+ "$controller_configs_path/RetroDECK_controller_switch_pro.vdf"
+ "$controller_configs_path/RetroDECK_controller_xbox360.vdf"
+ "$controller_configs_path/RetroDECK_controller_xboxone.vdf"
+ )
+
+ for this_vdf in "${controller_configs[@]}"; do
+ if [[ -f "$this_vdf" ]]; then
+ log d "Found an old Steam Controller profile, removing it: \"$this_vdf\""
+ rm -f "$this_vdf"
+ fi
+ done
+
+ log d "Renaming \"nintendo_button_layout\" into \"abxy_button_swap\" in the retrodeck config file: \"$rd_conf\""
sed -i 's^nintendo_button_layout^abxy_button_swap^' "$rd_conf" # This is a one-off sed statement as there are no functions for replacing section names
- mv -f /var/config/emulationstation/.emulationstation /var/config/emulationstation/ES-DE # in 3.0 .emulationstation was moved into ES-DE
- ln -s /var/config/emulationstation/ES-DE /var/config/emulationstation/.emulationstation # symlinking it to mantain the compatibility # TODO: remove this symlink n 0.9.0b
+ log i "Force disabling rewind, you can re-enable it via the Configurator"
+ set_setting_value "$raconf" "rewind_enable" "false" "retroarch"
+
+ # in 3.0 .emulationstation was moved into ES-DE
+ log i "Renaming old \"/var/config/emulationstation\" folder as \"/var/config/ES-DE\""
+ mv -f /var/config/emulationstation /var/config/ES-DE
+
+ prepare_component "reset" "es-de"
+ prepare_component "reset" "mame"
+ prepare_component "reset" "vita3k"
+ prepare_component "reset" "gzdoom"
+
+ if [ -d "$rdhome/.logs" ]; then
+ mv "$rdhome/.logs" "$logs_folder"
+ log i "Old log folder \"$rdhome/.logs\" found. Renamed it as \"$logs_folder\""
+ fi
+
+ # The save folder of rpcs3 was inverted so we're moving the saves into the real one
+ log i "RPCS3 saves needs to be migrated, executing."
+ if [[ "$(ls -A $bios_folder/rpcs3/dev_hdd0/home/00000001/savedata)" ]]; then
+ log i "Existing RPCS3 savedata found, backing up..."
+ create_dir "$backups_folder"
+ zip -rq9 "$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
+ fi
+ dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
+ log i "RPCS3 saves migration completed, a backup was made here: \"$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip\"."
+
+ log i "Switch firmware folder should be moved in \"$bios_folder/switch/firmware\" from \"$bios_folder/switch/registered\""
+ mv "$bios_folder/switch/registered" "$bios_folder/switch/firmware"
+
+ log i "New systems were added in this version, regenerating system folders."
+ #es-de --home "/var/config/" --create-system-dirs
+ es-de --create-system-dirs
+
fi
- # if [[ $prev_version -le "090" ]]; then
+ if [[ $(check_version_is_older_than "0.8.1b") == "true" ]]; then
+ log i "In version 0.8.1b, the following changes were made that required config file updates/reset or other changes to the filesystem:"
+ log i "- ES-DE files were moved inside the retrodeck folder, migrating to the new structure"
+ log i "- Give the user the option to reset Ryujinx, which was not properly initialized in 0.8.0b"
+
+ log d "ES-DE files were moved inside the retrodeck folder, migrating to the new structure"
+ dir_prep "$rdhome/ES-DE/collections" "/var/config/ES-DE/collections"
+ dir_prep "$rdhome/ES-DE/gamelists" "/var/config/ES-DE/gamelists"
+ log i "Moving ES-DE collections, downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\""
+ set_setting_value "$es_settings" "MediaDirectory" "$rdhome/ES-DE/downloaded_media" "es_settings"
+ set_setting_value "$es_settings" "UserThemeDirectory" "$rdhome/ES-DE/themes" "es_settings"
+ mv -f "$rdhome/themes" "$rdhome/ES-DE/themes" && log d "Move of \"$rdhome/themes\" completed"
+ mv -f "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" completed"
+ mv -f "$rdhome/gamelists/"* "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" completed"
+ rm -rf "$rdhome/gamelists"
+
+ log i "MAME-SA, migrating samples to the new exposed folder: from \"/var/data/mame/assets/samples\" to \"$bios_folder/mame-sa/samples\""
+ create_dir "$bios_folder/mame-sa/samples"
+ mv -f "/var/data/mame/assets/samples/"* "$bios_folder/mame-sa/samples"
+ set_setting_value "$mameconf" "samplepath" "$bios_folder/mame-sa/samples" "mame"
+
+ log i "Installing the missing ScummVM assets and renaming \"$mods_folder/RetroArch/ScummVM/themes\" into \"theme\""
+ mv -f "$mods_folder/RetroArch/ScummVM/themes" "$mods_folder/RetroArch/ScummVM/theme"
+ unzip -o "$emuconfigs/retroarch/ScummVM.zip" 'scummvm/extra/*' -d /tmp
+ unzip -o "$emuconfigs/retroarch/ScummVM.zip" 'scummvm/theme/*' -d /tmp
+ mv -f /tmp/scummvm/extra "$mods_folder/RetroArch/ScummVM"
+ mv -f /tmp/scummvm/theme "$mods_folder/RetroArch/ScummVM"
+ rm -rf /tmp/extra /tmp/theme
+
+ log i "Placing cheats in \"/var/data/mame/cheat\""
+ unzip -j -o "$emuconfigs/mame/cheat0264.zip" 'cheat.7z' -d "/var/data/mame/cheat"
+
+ log d "Verifying with user if they want to reset Ryujinx"
+ if [[ "$(configurator_generic_question_dialog "RetroDECK 0.8.1b Ryujinx Reset" "In RetroDECK 0.8.0b the Ryujinx emulator was not properly initialized for upgrading users.\nThis would cause Ryujinx to not work properly.\n\nWould you like to reset Ryujinx to default RetroDECK settings now?\n\nIf you have made your own changes to the Ryujinx config, you can decline this reset.")" == "true" ]]; then
+ log d "User agreed to Ryujinx reset"
+ prepare_component "reset" "ryujinx"
+ fi
+ fi
+
+ # if [[ $(check_version_is_older_than "0.9.0b") == "true" ]]; then
# # Placeholder for version 0.9.0b
# rm /var/config/emulationstation/.emulationstation # remving the old symlink to .emulationstation as it might be not needed anymore
+ # TODO: change RETRODECKHOMEDIR/bios/cemu in emu-configs/cemu/settings.xml into RETRODECKHOMEDIR/bios/cemu/mlc
+ # if [ ! -d "$bios_folder/cemu/mlc" ]; then
+ # log i "Cemu MLC folder was moved from \"$bios_folder/cemu\" to \"$bios_folder/cemu/mlc\", migrating it"
+ # mv -f "$bios_folder/cemu" "$bios_folder/cemu/mlc"
+ # # TODO: set setting value mlc_path in settings.xml (check prepare script)
+ # fi
+ # if [ -f "/var/data/Cemu/keys.txt" ]; then
+ # log AND ZENITY "Found Cemu keys.txt" in "/var/data/Cemu/keys.txt", for a better compatibility is better to move it into "$bios_folder/cemu/mlc/keys.txt, do you want to continue?
+ # if yes: mv "/var/data/Cemu/keys.txt" "$bios_folder/cemu/mlc/keys.txt"
+ # ln -s "$bios_folder/cemu/mlc/keys.txt" "/var/data/Cemu/keys.txt" <--- AND THIS SHOULD BE EVEN PUT IN THE PREPARATION SCRIPT
+ # fi
# fi
# The following commands are run every time.
@@ -259,7 +364,7 @@ post_update() {
rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "/var/data/primehack/Load/DynamicInputTextures/"
fi
- if [[ -f "$HOME/.steam/steam/controller_base/templates/RetroDECK_controller_config.vdf" ]]; then # If RetroDECK controller profile has been previously installed
+ if [[ ! -z $(find "$HOME/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") || ! -z $(find "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") ]]; then # If RetroDECK controller profile has been previously installed
install_retrodeck_controller_profile
fi
@@ -269,8 +374,9 @@ post_update() {
) |
zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
- --title "RetroDECK Finishing Upgrade" \
- --text="RetroDECK is finishing the upgrade process, please wait."
+ --title "RetroDECK - Upgrade Process" \
+ --width=400 --height=200 \
+ --text="RetroDECK is finishing up the upgrading process, please be patient.\n\nNOTICE - If the process is taking too long: \n\nSome windows might be running in the background that could require your attention: pop-ups from emulators or the upgrade itself that needs user input to continue.\n\n"
version=$hard_version
conf_write
@@ -280,31 +386,4 @@ post_update() {
else
changelog_dialog "$version"
fi
-
- if [[ $prev_version -le "075" ]]; then
- # In version 0.7.5b, the following changes were made:
- prepare_component "reset" "vita3k"
- prepare_component "reset" "mame"
- prepare_component "reset" "boilr"
- if [ -d "$rdhome/.logs" ]; then
- mv "$rdhome/.logs" "$logs_folder"
- log i "Logs folder renamed successfully"
- else
- log i "The .logs folder does not exist, continuing."
- fi
-
-
-
- # The save folder of rpcs3 was inverted so we're moving the saves into the real one
- echo "RPCS3 saves needs to be migrated, executing."
- mv "$saves_folder/ps3/rpcs3" "$saves_folder/ps3/rpcs3.bak"
- mkdir -p "$saves_folder/ps3/rpcs3"
- mv -v "$saves_folder/ps3/rpcs3.bak"/* "$saves_folder/ps3/rpcs3"
- mv -v "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"/* "$saves_folder/ps3/rpcs3"
- mv -v "$saves_folder/ps3/rpcs3.bak" "$rdhome/backups/saves/ps3/rpcs3"
- echo "RPCS3 saves migration completed, a backup was made here: \"$rdhome/backups/saves/ps3/rpcs3\"."
- source /app/libexec/functions.sh
- dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
-
- fi
}
diff --git a/functions/prepare_component.sh b/functions/prepare_component.sh
index b367217b..adad0d90 100644
--- a/functions/prepare_component.sh
+++ b/functions/prepare_component.sh
@@ -10,9 +10,11 @@ prepare_component() {
# USAGE: prepare_component "$action" "$component" "$call_source(optional)"
action="$1"
- component="$2"
+ component=$(echo "$2" | tr '[:upper:]' '[:lower:]')
call_source="$3"
+ log d "Preparing component: \"$component\", action: \"$action\""
+
if [[ "$component" == "retrodeck" ]]; then
if [[ "$action" == "reset" ]]; then # Update the paths of all folders in retrodeck.cfg and create them
while read -r config_line; do
@@ -20,10 +22,17 @@ prepare_component() {
if [[ ! $current_setting_name =~ (rdhome|sdcard) ]]; then # Ignore these locations
local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths")
declare -g "$current_setting_name=$rdhome/$(basename $current_setting_value)"
- mkdir -p "$rdhome/$(basename $current_setting_value)"
+ if [[ ! $current_setting_name == "logs_folder" ]]; then # Don't create a logs folder normally, we want to maintain the current files exactly to not lose early-install logs.
+ create_dir "$rdhome/$(basename $current_setting_value)"
+ else # Log folder-specific actions
+ mv "$rd_logs_folder" "$logs_folder" # Move existing logs folder from internal to userland
+ ln -sf "$logs_folder" "$rd_logs_folder" # Link userland logs folder back to statically-written location
+ log d "Logs folder moved to $logs_folder and linked back to $rd_logs_folder"
+ fi
fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
- mkdir -p "/var/config/retrodeck/godot"
+ create_dir "/var/config/retrodeck/godot"
+
fi
if [[ "$action" == "postmove" ]]; then # Update the paths of any folders that came with the retrodeck folder during a move
while read -r config_line; do
@@ -35,42 +44,52 @@ prepare_component() {
fi
fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
+ dir_prep "$logs_folder" "$rd_logs_folder"
fi
fi
- if [[ "$component" =~ ^(es-de|ES-DE|all)$ ]]; then # For use after ESDE-related folders are moved or a reset
+ if [[ "$component" =~ ^(es-de|all)$ ]]; then # For use after ESDE-related folders are moved or a reset
+ log i "--------------------------------"
+ log i "Prepearing ES-DE"
+ log i "--------------------------------"
if [[ "$action" == "reset" ]]; then
- rm -rf /var/config/emulationstation/
- mkdir -p /var/config/emulationstation/ES-DE/
- cp -f /app/retrodeck/es_settings.xml /var/config/emulationstation/ES-DE/es_settings.xml
+ rm -rf /var/config/ES-DE
+ create_dir /var/config/ES-DE/settings
+ log d "Prepearing es_settings.xml"
+ cp -f /app/retrodeck/es_settings.xml /var/config/ES-DE/settings/es_settings.xml
set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings"
set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings"
set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings"
- dir_prep "$rdhome/gamelists" "/var/config/emulationstation/ES-DE/gamelists"
- emulationstation --home /var/config/emulationstation --create-system-dirs
+ dir_prep "$rdhome/ES-DE/gamelists" "/var/config/ES-DE/gamelists"
+ dir_prep "$rdhome/ES-DE/collections" "/var/config/ES-DE/collections"
+ dir_prep "$rd_logs_folder/ES-DE" "$es_source_logs"
+ log d "Generating roms system folders"
+ #es-de --home /var/config/ES-DE --create-system-dirs
+ es-de --create-system-dirs
update_splashscreens
fi
if [[ "$action" == "postmove" ]]; then
set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings"
set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings"
set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings"
- dir_prep "$rdhome/gamelists" "/var/config/emulationstation/ES-DE/gamelists"
+ dir_prep "$rdhome/gamelists" "/var/config/ES-DE/gamelists"
fi
fi
- if [[ "$component" =~ ^(retroarch|RetroArch|all)$ ]]; then
+ if [[ "$component" =~ ^(retroarch|all)$ ]]; then
+ log i "--------------------------------"
+ log i "Prepearing RetroArch"
+ log i "--------------------------------"
if [[ "$action" == "reset" ]]; then # Run reset-only commands
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/retroarch"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/retroarch"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/retroarch"
cp -fv $emuconfigs/retroarch/retroarch.cfg "$multi_user_data_folder/$SteamAppUser/config/retroarch/"
cp -fv $emuconfigs/retroarch/retroarch-core-options.cfg "$multi_user_data_folder/$SteamAppUser/config/retroarch/"
else # Single-user actions
- rm -rf /var/config/retroarch
- mkdir -p /var/config/retroarch
+ create_dir -d /var/config/retroarch
dir_prep "$bios_folder" "/var/config/retroarch/system"
- dir_prep "$logs_folder/retroarch" "/var/config/retroarch/logs"
- mkdir -pv /var/config/retroarch/shaders/
+ dir_prep "$rdhome/logs/retroarch" "/var/config/retroarch/logs"
+ create_dir /var/config/retroarch/shaders/
cp -rf /app/share/libretro/shaders /var/config/retroarch/
dir_prep "$rdhome/shaders/retroarch" "/var/config/retroarch/shaders"
rsync -rlD --mkpath "/app/share/libretro/cores/" "/var/config/retroarch/cores/"
@@ -84,13 +103,28 @@ prepare_component() {
set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch"
set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch"
set_setting_value "$raconf" "log_dir" "$logs_folder" "retroarch"
+ set_setting_value "$raconf" "rgui_browser_directory" "$roms_folder" "retroarch"
fi
# Shared actions
+ create_dir "$bios_folder/np2kai"
+ create_dir "$bios_folder/dc"
+ create_dir "$bios_folder/Mupen64plus"
+ create_dir "$bios_folder/quasi88"
+
+ # FBNEO
+ log i "--------------------------------"
+ log i "Prepearing FBNEO_LIBRETRO"
+ log i "--------------------------------"
+ create_dir "$bios_folder/fbneo/samples"
+ create_dir "$bios_folder/fbneo/cheats"
+ create_dir "$bios_folder/fbneo/blend"
+ dir_prep "$mods_folder/FBNeo" "$bios_folder/fbneo/patched"
+
# PPSSPP
- echo "--------------------------------"
- echo "Initializing PPSSPP_LIBRETRO"
- echo "--------------------------------"
+ log i "--------------------------------"
+ log i "Prepearing PPSSPP_LIBRETRO"
+ log i "--------------------------------"
if [ -d $bios_folder/PPSSPP/flash0/font ]
then
mv -fv $bios_folder/PPSSPP/flash0/font $bios_folder/PPSSPP/flash0/font.bak
@@ -102,17 +136,38 @@ prepare_component() {
fi
# MSX / SVI / ColecoVision / SG-1000
- echo "-----------------------------------------------------------"
- echo "Initializing MSX / SVI / ColecoVision / SG-1000 LIBRETRO"
- echo "-----------------------------------------------------------"
+ log i "-----------------------------------------------------------"
+ log i "Prepearing MSX / SVI / ColecoVision / SG-1000 LIBRETRO"
+ log i "-----------------------------------------------------------"
+ log i "Copying \"/app/retrodeck/extras/MSX/Databases\" in \"$bios_folder/Databases\""
cp -rf "/app/retrodeck/extras/MSX/Databases" "$bios_folder/Databases"
+ log i "Copying \"/app/retrodeck/extras/MSX/Machines\" in \"$bios_folder/Machines\""
cp -rf "/app/retrodeck/extras/MSX/Machines" "$bios_folder/Machines"
# AMIGA
- echo "-----------------------------------------------------------"
- echo "Initializing AMIGA LIBRETRO"
- echo "-----------------------------------------------------------"
+ log i "-----------------------------------------------------------"
+ log i "Prepearing AMIGA LIBRETRO"
+ log i "-----------------------------------------------------------"
+ log i "Copying \"/app/retrodeck/extras/Amiga/capsimg.so\" in \"$bios_folder/capsimg.so\""
cp -f "/app/retrodeck/extras/Amiga/capsimg.so" "$bios_folder/capsimg.so"
+
+ # ScummVM
+ log i "-----------------------------------------------------------"
+ log i "Prepearing ScummVM LIBRETRO"
+ log i "-----------------------------------------------------------"
+ cp -fv "$emuconfigs/retroarch/scummvm.ini" "$ra_scummvm_conf"
+ create_dir "$mods_folder/RetroArch/ScummVM/icons"
+ log i "Installing ScummVM assets"
+ unzip -o "$emuconfigs/retroarch/ScummVM.zip" 'scummvm/extra/*' -d /tmp
+ unzip -o "$emuconfigs/retroarch/ScummVM.zip" 'scummvm/theme/*' -d /tmp
+ mv -f /tmp/scummvm/extra "$mods_folder/RetroArch/ScummVM"
+ mv -f /tmp/scummvm/theme "$mods_folder/RetroArch/ScummVM"
+ rm -rf /tmp/extra /tmp/theme
+ set_setting_value "$ra_scummvm_conf" "iconspath" "$mods_folder/RetroArch/ScummVM/icons" "libretro_scummvm" "scummvm"
+ set_setting_value "$ra_scummvm_conf" "extrapath" "$mods_folder/RetroArch/ScummVM/extra" "libretro_scummvm" "scummvm"
+ set_setting_value "$ra_scummvm_conf" "themepath" "$mods_folder/RetroArch/ScummVM/theme" "libretro_scummvm" "scummvm"
+ set_setting_value "$ra_scummvm_conf" "savepath" "$saves_folder/scummvm" "libretro_scummvm" "scummvm"
+ set_setting_value "$ra_scummvm_conf" "browser_lastpath" "$roms_folder/scummvm" "libretro_scummvm" "scummvm"
dir_prep "$texture_packs_folder/RetroArch-Mesen" "/var/config/retroarch/system/HdPacks"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "/var/config/retroarch/system/Mupen64plus/cache"
@@ -155,43 +210,13 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(cemu|Cemu|all)$ ]]; then
+ if [[ "$component" =~ ^(citra|citra-emu|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "----------------------"
- echo "Initializing CEMU"
- echo "----------------------"
+ log i "------------------------"
+ log i "Prepearing CITRA"
+ log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/Cemu"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/Cemu"
- cp -fr "$emuconfigs/cemu/"* "$multi_user_data_folder/$SteamAppUser/config/Cemu/"
- set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "mlc_path" "$bios_folder/cemu" "cemu"
- set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
- dir_prep "$multi_user_data_folder/$SteamAppUser/config/Cemu" "/var/config/Cemu"
- else
- rm -rf /var/config/Cemu
- mkdir -pv /var/config/Cemu/
- cp -fr "$emuconfigs/cemu/"* /var/config/Cemu/
- set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu"
- set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
- fi
- # Shared actions
- dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save"
- fi
- if [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves
- set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu"
- set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
- dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save"
- fi
- fi
-
- if [[ "$component" =~ ^(citra|citra-emu|Citra|all)$ ]]; then
- if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "------------------------"
- echo "Initializing CITRA"
- echo "------------------------"
- if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/citra-emu"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/citra-emu"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/citra-emu"
cp -fv $emuconfigs/citra/qt-config.ini "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage"
@@ -199,8 +224,7 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\screenshotPath" "$screenshots_folder" "citra" "UI"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/citra-emu" "/var/config/citra-emu"
else # Single-user actions
- rm -rf /var/config/citra-emu
- mkdir -pv /var/config/citra-emu/
+ create_dir -d /var/config/citra-emu/
cp -f $emuconfigs/citra/qt-config.ini /var/config/citra-emu/qt-config.ini
set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage"
set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage"
@@ -208,8 +232,8 @@ prepare_component() {
set_setting_value "$citraconf" "Paths\screenshotPath" "$screenshots_folder" "citra" "UI"
fi
# Shared actions
- mkdir -pv "$saves_folder/n3ds/citra/nand/"
- mkdir -pv "$saves_folder/n3ds/citra/sdmc/"
+ create_dir "$saves_folder/n3ds/citra/nand/"
+ create_dir "$saves_folder/n3ds/citra/sdmc/"
dir_prep "$bios_folder/citra/sysdata" "/var/data/citra-emu/sysdata"
dir_prep "$logs_folder/citra" "/var/data/citra-emu/log"
dir_prep "$mods_folder/Citra" "/var/data/citra-emu/load/mods"
@@ -231,14 +255,40 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(dolphin|dolphin-emu|Dolphin|all)$ ]]; then
+ if [[ "$component" =~ ^(cemu|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "----------------------"
- echo "Initializing DOLPHIN"
- echo "----------------------"
+ log i "----------------------"
+ log i "Prepearing CEMU"
+ log i "----------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/Cemu"
+ cp -fr "$emuconfigs/cemu/"* "$multi_user_data_folder/$SteamAppUser/config/Cemu/"
+ set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "mlc_path" "$bios_folder/cemu" "cemu"
+ set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
+ dir_prep "$multi_user_data_folder/$SteamAppUser/config/Cemu" "/var/config/Cemu"
+ else
+ create_dir -d /var/config/Cemu/
+ cp -fr "$emuconfigs/cemu/"* /var/config/Cemu/
+ set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu"
+ set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
+ fi
+ # Shared actions
+ dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save"
+ fi
+ if [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves
+ set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu"
+ set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
+ dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save"
+ fi
+ fi
+
+ if [[ "$component" =~ ^(dolphin|dolphin-emu|all)$ ]]; then
+ if [[ "$action" == "reset" ]]; then # Run reset-only commands
+ log i "----------------------"
+ log i "Prepearing DOLPHIN"
+ log i "----------------------"
+ if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu"
cp -fvr "$emuconfigs/dolphin/"* "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "BIOS" "$bios_folder" "dolphin" "GBA"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "SavesPath" "$saves_folder/gba" "dolphin" "GBA"
@@ -247,8 +297,7 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu" "/var/config/dolphin-emu"
else # Single-user actions
- rm -rf /var/config/dolphin-emu
- mkdir -pv /var/config/dolphin-emu/
+ create_dir -d /var/config/dolphin-emu/
cp -fvr "$emuconfigs/dolphin/"* /var/config/dolphin-emu/
set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA"
set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA"
@@ -286,14 +335,13 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(duckstation|Duckstation|all)$ ]]; then
+ if [[ "$component" =~ ^(duckstation|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "------------------------"
- echo "Initializing DUCKSTATION"
- echo "------------------------"
+ log i "------------------------"
+ log i "Prepearing DUCKSTATION"
+ log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/duckstation"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/data/duckstation/"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/data/duckstation/"
cp -fv "$emuconfigs/duckstation/"* "$multi_user_data_folder/$SteamAppUser/data/duckstation"
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "SearchDirectory" "$bios_folder" "duckstation" "BIOS"
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards"
@@ -302,9 +350,8 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/duckstation" "/var/config/duckstation"
else # Single-user actions
- rm -rf "/var/config/duckstation"
- mkdir -p "/var/config/duckstation/"
- mkdir -p "$saves_folder/psx/duckstation/memcards"
+ create_dir -d "/var/config/duckstation/"
+ create_dir "$saves_folder/psx/duckstation/memcards"
cp -fv "$emuconfigs/duckstation/"* /var/config/duckstation
set_setting_value "$duckstationconf" "SearchDirectory" "$bios_folder" "duckstation" "BIOS"
set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards"
@@ -333,14 +380,13 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(melonds|melonDS|MelonDS|all)$ ]]; then
+ if [[ "$component" =~ ^(melonds|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "----------------------"
- echo "Initializing MELONDS"
- echo "----------------------"
+ log i "----------------------"
+ log i "Prepearing MELONDS"
+ log i "----------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/melonDS"
- mkdir -pv "$multi_user_data_folder/$SteamAppUser/config/melonDS/"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/melonDS/"
cp -fvr $emuconfigs/melonds/melonDS.ini "$multi_user_data_folder/$SteamAppUser/config/melonDS/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS9Path" "$bios_folder/bios9.bin" "melonds"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS7Path" "$bios_folder/bios7.bin" "melonds"
@@ -349,8 +395,7 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SavestatePath" "$states_folder/nds/melonds" "melonds"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/melonDS" "/var/config/melonDS"
else # Single-user actions
- rm -rf /var/config/melonDS
- mkdir -pv /var/config/melonDS/
+ create_dir -d /var/config/melonDS/
cp -fvr $emuconfigs/melonds/melonDS.ini /var/config/melonDS/
set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds"
set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds"
@@ -359,8 +404,8 @@ prepare_component() {
set_setting_value "$melondsconf" "SavestatePath" "$states_folder/nds/melonds" "melonds"
fi
# Shared actions
- mkdir -pv "$saves_folder/nds/melonds"
- mkdir -pv "$states_folder/nds/melonds"
+ create_dir "$saves_folder/nds/melonds"
+ create_dir "$states_folder/nds/melonds"
dir_prep "$bios_folder" "/var/config/melonDS/bios"
fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands
@@ -373,14 +418,13 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(pcsx2|PCSX2|all)$ ]]; then
+ if [[ "$component" =~ ^(pcsx2|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "----------------------"
- echo "Initializing PCSX2"
- echo "----------------------"
+ log i "----------------------"
+ log i "Prepearing PCSX2"
+ log i "----------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/PCSX2"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis"
cp -fvr "$emuconfigs/PCSX2/"* "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "Bios" "$bios_folder" "pcsx2" "Folders"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "Snapshots" "$screenshots_folder" "pcsx2" "Folders"
@@ -389,8 +433,7 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/PCSX2" "/var/config/PCSX2"
else # Single-user actions
- rm -rf /var/config/PCSX2
- mkdir -pv "/var/config/PCSX2/inis"
+ create_dir -d "/var/config/PCSX2/inis"
cp -fvr "$emuconfigs/PCSX2/"* /var/config/PCSX2/inis/
set_setting_value "$pcsx2conf" "Bios" "$bios_folder" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "Snapshots" "$screenshots_folder" "pcsx2" "Folders"
@@ -399,8 +442,8 @@ prepare_component() {
set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList"
fi
# Shared actions
- mkdir -pv "$saves_folder/ps2/pcsx2/memcards"
- mkdir -pv "$states_folder/ps2/pcsx2"
+ create_dir "$saves_folder/ps2/pcsx2/memcards"
+ create_dir "$states_folder/ps2/pcsx2"
dir_prep "$texture_packs_folder/PCSX2" "/var/config/PCSX2/textures"
# Reset default preset settings
@@ -429,20 +472,18 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(ppsspp|PPSSPP|all)$ ]]; then
+ if [[ "$component" =~ ^(ppsspp|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "------------------------"
- echo "Initializing PPSSPPSDL"
- echo "------------------------"
+ log i "------------------------"
+ log i "Prepearing PPSSPPSDL"
+ log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/ppsspp"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/"
cp -fv "$emuconfigs/ppssppsdl/"* "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/ppsspp.ini" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/ppsspp" "/var/config/ppsspp"
else # Single-user actions
- rm -rf /var/config/ppsspp
- mkdir -p /var/config/ppsspp/PSP/SYSTEM/
+ create_dir -d /var/config/ppsspp/PSP/SYSTEM/
cp -fv "$emuconfigs/ppssppsdl/"* /var/config/ppsspp/PSP/SYSTEM/
set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General"
fi
@@ -459,21 +500,19 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(primehack|Primehack|all)$ ]]; then
+ if [[ "$component" =~ ^(primehack|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "----------------------"
- echo "Initializing Primehack"
- echo "----------------------"
+ log i "----------------------"
+ log i "Prepearing Primehack"
+ log i "----------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/primehack"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/primehack"
- cp -fvr "$emuconfigs/primehack/"* "$multi_user_data_folder/$SteamAppUser/config/primehack/"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/primehack"
+ cp -fvr "$emuconfigs/primehack/config/"* "$multi_user_data_folder/$SteamAppUser/config/primehack/"
set_setting_value ""$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini"" "ISOPath0" "$roms_folder/gc" "primehack" "General"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/primehack" "/var/config/primehack"
else # Single-user actions
- rm -rf /var/config/primehack
- mkdir -pv /var/config/primehack/
- cp -fvr "$emuconfigs/primehack/"* /var/config/primehack/
+ create_dir -d /var/config/primehack/
+ cp -fvr "$emuconfigs/primehack/config/"* /var/config/primehack/
set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/gc" "primehack" "General"
fi
# Shared actions
@@ -482,10 +521,11 @@ prepare_component() {
dir_prep "$saves_folder/gc/primehack/JP" "/var/data/primehack/GC/JAP"
dir_prep "$screenshots_folder" "/var/data/primehack/ScreenShots"
dir_prep "$states_folder/primehack" "/var/data/primehack/StateSaves"
- mkdir -pv /var/data/primehack/Wii/
+ create_dir /var/data/primehack/Wii/
dir_prep "$saves_folder/wii/primehack" "/var/data/primehack/Wii"
dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods"
dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures"
+ cp -fvr "$emuconfigs/primehack/data/"* "$multi_user_data_folder/$SteamAppUser/data/primehack/" # this must be done after the dirs are prepared as it copying some "mods"
# Reset default preset settings
set_setting_value "$rd_conf" "primehack" "$(get_setting_value "$rd_defaults" "primehack" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
@@ -503,22 +543,20 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(rpcs3|RPCS3|all)$ ]]; then
+ if [[ "$component" =~ ^(rpcs3|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "------------------------"
- echo "Initializing RPCS3"
- echo "------------------------"
+ log i "------------------------"
+ log i "Prepearing RPCS3"
+ log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/rpcs3"
- mkdir -pv "$multi_user_data_folder/$SteamAppUser/config/rpcs3/"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/rpcs3/"
cp -fr "$emuconfigs/rpcs3/"* "$multi_user_data_folder/$SteamAppUser/config/rpcs3/"
# This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name.
sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml" "/games/" "$roms_folder/ps3/" "rpcs3"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/rpcs3" "/var/config/rpcs3"
else # Single-user actions
- rm -rf /var/config/rpcs3
- mkdir -pv /var/config/rpcs3/
+ create_dir -d /var/config/rpcs3/
cp -fr "$emuconfigs/rpcs3/"* /var/config/rpcs3/
# This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name.
sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf"
@@ -526,13 +564,13 @@ prepare_component() {
dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
fi
# Shared actions
- mkdir -p "$bios_folder/rpcs3/dev_hdd0"
- mkdir -p "$bios_folder/rpcs3/dev_hdd1"
- mkdir -p "$bios_folder/rpcs3/dev_flash"
- mkdir -p "$bios_folder/rpcs3/dev_flash2"
- mkdir -p "$bios_folder/rpcs3/dev_flash3"
- mkdir -p "$bios_folder/rpcs3/dev_bdvd"
- mkdir -p "$bios_folder/rpcs3/dev_usb000"
+ create_dir "$bios_folder/rpcs3/dev_hdd0"
+ create_dir "$bios_folder/rpcs3/dev_hdd1"
+ create_dir "$bios_folder/rpcs3/dev_flash"
+ create_dir "$bios_folder/rpcs3/dev_flash2"
+ create_dir "$bios_folder/rpcs3/dev_flash3"
+ create_dir "$bios_folder/rpcs3/dev_bdvd"
+ create_dir "$bios_folder/rpcs3/dev_usb000"
fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands
# This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name.
@@ -541,43 +579,112 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(ryujunx|Ryujinx|all)$ ]]; then
+ if [[ "$component" =~ ^(ryujinx|all)$ ]]; then
+ # NOTE: for techincal reasons the system folder of Ryujinx IS NOT a sumlink of the bios/switch/keys as not only the keys are located there
+ # When RetroDECK starts there is a "manage_ryujinx_keys" function that symlinks the keys only in Rryujinx/system.
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "------------------------"
- echo "Initializing RYUJINX"
- echo "------------------------"
+ log i "------------------------"
+ log i "Prepearing RYUJINX"
+ log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then
rm -rf "$multi_user_data_folder/$SteamAppUser/config/Ryujinx"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/system"
+ #create_dir "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/system"
+ # TODO: add /var/config/Ryujinx/system system folder management
cp -fv $emuconfigs/ryujinx/* "$multi_user_data_folder/$SteamAppUser/config/Ryujinx"
- sed -i 's#/home/deck/retrodeck#'$rdhome'#g' "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/Config.json"
+ sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/Config.json"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" "/var/config/Ryujinx"
+ # TODO: add nand (saves) folder management
+ # TODO: add nand (saves) folder management
+ # TODO: add "registered" folder management
else
# removing config directory to wipe legacy files
+ log d "Removing \"/var/config/Ryujinx\""
rm -rf /var/config/Ryujinx
- mkdir -p /var/config/Ryujinx/system
- cp -fv $emuconfigs/ryujinx/* /var/config/Ryujinx
- sed -i 's#/home/deck/retrodeck#'$rdhome'#g' "$ryujinxconf"
+ create_dir /var/config/Ryujinx/system
+ cp -fv $emuconfigs/ryujinx/Config.json $ryujinxconf
+ cp -fvr $emuconfigs/ryujinx/profiles /var/config/Ryujinx/
+ log d "Replacing placeholders in \"$ryujinxconf\""
+ sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$ryujinxconf"
+ log i "Linking switch nand/saves folder"
+ log d "Removing \"/var/config/Ryujinx/bis\", it will become a symlink"
+ rm -rf /var/config/Ryujinx/bis
+ dir_prep "$saves_folder/switch/ryujinx/nand" "/var/config/Ryujinx/bis"
+ dir_prep "$saves_folder/switch/ryujinx/sdcard" "/var/config/Ryujinx/sdcard"
+ dir_prep "$bios_folder/switch/firmware" "/var/config/Ryujinx/bis/system/Contents/registered"
+ dir_prep "$bios_folder/switch/keys" "/var/config/Ryujinx/system"
fi
fi
- if [[ "$action" == "reset" ]] || [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves
- dir_prep "$bios_folder/switch/keys" "/var/config/Ryujinx/system"
- fi
+ # if [[ "$action" == "reset" ]] || [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves
+ # dir_prep "$bios_folder/switch/keys" "/var/config/Ryujinx/system"
+ # fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands
+ log d "Replacing placeholders in \"$ryujinxconf\""
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$ryujinxconf" # This is an unfortunate one-off because set_setting_value does not currently support JSON
fi
fi
- if [[ "$component" =~ ^(xemu|XEMU|all)$ ]]; then
+ if [[ "$component" =~ ^(yuzu|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "------------------------"
- echo "Initializing XEMU"
- echo "------------------------"
+ log i "----------------------"
+ log i "Prepearing YUZU"
+ log i "----------------------"
+ if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/yuzu"
+ cp -fvr "$emuconfigs/yuzu/"* "$multi_user_data_folder/$SteamAppUser/config/yuzu/"
+ set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
+ set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
+ set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
+ set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
+ dir_prep "$multi_user_data_folder/$SteamAppUser/config/yuzu" "/var/config/yuzu"
+ else # Single-user actions
+ create_dir -d /var/config/yuzu/
+ cp -fvr "$emuconfigs/yuzu/"* /var/config/yuzu/
+ set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
+ set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
+ set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
+ set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
+ fi
+ # Shared actions
+ dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand"
+ dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc"
+ dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys"
+ dir_prep "$bios_folder/switch/firmware" "/var/data/yuzu/nand/system/Contents/registered"
+ dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log"
+ dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots"
+ dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load"
+ # removing dead symlinks as they were present in a past version
+ if [ -d $bios_folder/switch ]; then
+ find $bios_folder/switch -xtype l -exec rm {} \;
+ fi
+
+ # Reset default preset settings
+ set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
+ set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
+ fi
+ if [[ "$action" == "postmove" ]]; then # Run only post-move commands
+ dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys"
+ dir_prep "$bios_folder/switch/firmware" "/var/data/yuzu/nand/system/Contents/registered"
+ dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand"
+ dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc"
+ dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log"
+ dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots"
+ dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load"
+ set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
+ set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
+ set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
+ set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
+ fi
+ fi
+
+ if [[ "$component" =~ ^(xemu|all)$ ]]; then
+ if [[ "$action" == "reset" ]]; then # Run reset-only commands
+ log i "------------------------"
+ log i "Prepearing XEMU"
+ log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
rm -rf /var/config/xemu
rm -rf /var/data/xemu
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/xemu"
- mkdir -pv "$multi_user_data_folder/$SteamAppUser/config/xemu/"
+ create_dir -d "$multi_user_data_folder/$SteamAppUser/config/xemu/"
cp -fv $emuconfigs/xemu/xemu.toml "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "screenshot_dir" "'$screenshots_folder'" "xemu" "General"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "bootrom_path" "'$bios_folder/mcpx_1.0.bin'" "xemu" "sys.files"
@@ -597,7 +704,7 @@ prepare_component() {
set_setting_value "$xemuconf" "eeprom_path" "'$saves_folder/xbox/xemu/xbox-eeprom.bin'" "xemu" "sys.files"
set_setting_value "$xemuconf" "hdd_path" "'$bios_folder/xbox_hdd.qcow2'" "xemu" "sys.files"
fi # Shared actions
- mkdir -pv $saves_folder/xbox/xemu/
+ create_dir $saves_folder/xbox/xemu/
# Preparing HD dummy Image if the image is not found
if [ ! -f $bios_folder/xbox_hdd.qcow2 ]
then
@@ -613,86 +720,23 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(yuzu|Yuzu|all)$ ]]; then
+ if [[ "$component" =~ ^(vita3k|all)$ ]]; then
if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "----------------------"
- echo "Initializing YUZU"
- echo "----------------------"
+ log i "----------------------"
+ log i "Prepearing Vita3K"
+ log i "----------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- rm -rf "$multi_user_data_folder/$SteamAppUser/config/yuzu"
- mkdir -p "$multi_user_data_folder/$SteamAppUser/config/yuzu"
- cp -fvr "$emuconfigs/yuzu/"* "$multi_user_data_folder/$SteamAppUser/config/yuzu/"
- set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
- set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
- set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
- set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
- dir_prep "$multi_user_data_folder/$SteamAppUser/config/yuzu" "/var/config/yuzu"
- else # Single-user actions
- rm -rf /var/config/yuzu
- mkdir -pv /var/config/yuzu/
- cp -fvr "$emuconfigs/yuzu/"* /var/config/yuzu/
- set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
- set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
- set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
- set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
- fi
- # Shared actions
- dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand"
- dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc"
- dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys"
- dir_prep "$bios_folder/switch/registered" "/var/data/yuzu/nand/system/Contents/registered"
- dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log"
- dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots"
- dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load"
- mkdir -pv "$rdhome/customs/yuzu"
- # removing dead symlinks as they were present in a past version
- if [ -d $bios_folder/switch ]; then
- find $bios_folder/switch -xtype l -exec rm {} \;
- fi
-
- # Reset default preset settings
- set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
- set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
- fi
- if [[ "$action" == "postmove" ]]; then # Run only post-move commands
- dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys"
- dir_prep "$bios_folder/switch/registered" "/var/data/yuzu/nand/system/Contents/registered"
- dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand"
- dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc"
- dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log"
- dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots"
- dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load"
- set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
- set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
- set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
- set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
- fi
- fi
-
- if [[ "$component" =~ ^(vita3k|Vita3K|all)$ ]]; then
- if [[ "$action" == "reset" ]]; then # Run reset-only commands
- echo "----------------------"
- echo "Initializing Vita3K"
- echo "----------------------"
- if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
- echo "Figure out what Vita3k needs for multi-user"
+ log d "Figure out what Vita3k needs for multi-user"
else # Single-user actions
# NOTE: the component is writing in "." so it must be placed in the rw filesystem. A symlink of the binary is already placed in /app/bin/Vita3K
rm -rf "/var/data/Vita3K"
- mkdir -p "/var/data/Vita3K/Vita3K"
+ create_dir "/var/data/Vita3K/Vita3K"
cp -fvr "$emuconfigs/vita3k/config.yml" "/var/data/Vita3K" # component config
cp -fvr "$emuconfigs/vita3k/ux0" "$bios_folder/Vita3K/Vita3K" # User config
set_setting_value "$vita3kconf" "pref-path" "$rdhome/bios/Vita3K/Vita3K/" "vita3k"
fi
# Shared actions
dir_prep "$saves_folder/psvita/vita3k" "$bios_folder/Vita3K/Vita3K/ux0/user/00/savedata" # Multi-user safe?
-
- # Installing firmware
- # TODO: at the moment this is here instead of a tool because it seems like it cannot run without Firmware
- curl "http://dus01.psv.update.playstation.net/update/psv/image/2022_0209/rel_f2c7b12fe85496ec88a0391b514d6e3b/PSVUPDAT.PUP" -po /tmp/PSVUPDAT.PUP
- curl "http://dus01.psp2.update.playstation.net/update/psp2/image/2019_0924/sd_8b5f60b56c3da8365b973dba570c53a5/PSP2UPDAT.PUP?dest=us" -po /tmp/PSP2UPDAT.PUP
- Vita3K --firmware /tmp/PSVUPDAT.PUP
- Vita3K --firmware /tmp/PSP2UPDAT.PUP
fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$saves_folder/psvita/vita3k" "$bios_folder/Vita3K/Vita3K/ux0/user/00/savedata" # Multi-user safe?
@@ -700,47 +744,106 @@ prepare_component() {
fi
fi
- if [[ "$component" =~ ^(mame|MAME|all)$ ]]; then
+ if [[ "$component" =~ ^(mame|all)$ ]]; then
# TODO: do a proper script
- # This is just a placeholder script to test the component's flow
- echo "----------------------"
- echo "Initializing MAME"
- echo "----------------------"
+ # This is just a placeholder script to test the emulator's flow
+ log i "----------------------"
+ log i "Prepearing MAME"
+ log i "----------------------"
+
+ # TODO: probably some of these needs to be put elsewhere
+ create_dir "$saves_folder/mame-sa"
+ create_dir "$saves_folder/mame-sa/nvram"
+ create_dir "$states_folder/mame-sa"
+ create_dir "$rdhome/screenshots/mame-sa"
+ create_dir "$saves_folder/mame-sa/diff"
+
+ create_dir "/var/config/ctrlr"
+ create_dir "/var/config/mame/ini"
+ create_dir "/var/config/mame/cfg"
+ create_dir "/var/config/mame/inp"
+
+ create_dir "/var/data/mame/plugin-data"
+ create_dir "/var/data/mame/hash"
+ create_dir "$bios_folder/mame-sa/samples"
+ create_dir "/var/data/mame/assets/artwork"
+ create_dir "/var/data/mame/assets/fonts"
+ create_dir "/var/data/mame/cheat"
+ create_dir "/var/data/mame/assets/crosshair"
+ create_dir "/var/data/mame/plugins"
+ create_dir "/var/data/mame/assets/language"
+ create_dir "/var/data/mame/assets/software"
+ create_dir "/var/data/mame/assets/comments"
+ create_dir "/var/data/mame/assets/share"
+ create_dir "/var/data/mame/dats"
+ create_dir "/var/data/mame/folders"
+ create_dir "/var/data/mame/assets/cabinets"
+ create_dir "/var/data/mame/assets/cpanel"
+ create_dir "/var/data/mame/assets/pcb"
+ create_dir "/var/data/mame/assets/flyers"
+ create_dir "/var/data/mame/assets/titles"
+ create_dir "/var/data/mame/assets/ends"
+ create_dir "/var/data/mame/assets/marquees"
+ create_dir "/var/data/mame/assets/artwork-preview"
+ create_dir "/var/data/mame/assets/bosses"
+ create_dir "/var/data/mame/assets/logo"
+ create_dir "/var/data/mame/assets/scores"
+ create_dir "/var/data/mame/assets/versus"
+ create_dir "/var/data/mame/assets/gameover"
+ create_dir "/var/data/mame/assets/howto"
+ create_dir "/var/data/mame/assets/select"
+ create_dir "/var/data/mame/assets/icons"
+ create_dir "/var/data/mame/assets/covers"
+ create_dir "/var/data/mame/assets/ui"
- mkdir -p $saves_folder/mame-sa
- mkdir -p "/var/config/mame"
dir_prep "$saves_folder/mame-sa/hiscore" "/var/config/mame/hiscore"
- cp -fvr "$emuconfigs/mame/"** "/var/config/mame"
- sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "/var/config/mame/*.ini"
- sed -i 's#RETRODECKHOMESDIR#'$rdhome'#g' "/var/config/mame/*.ini"
- sed -i 's#RETRODECKSAVESDIR#'$rdhome'#g' "/var/config/mame/*.ini"
- sed -i 's#RETRODECKSTATESDIR#'$rdhome'#g' "/var/config/mame/*.ini"
+ cp -fvr "$emuconfigs/mame/mame.ini" "$mameconf"
+ cp -fvr "$emuconfigs/mame/ui.ini" "$mameuiconf"
+ cp -fvr "$emuconfigs/mame/default.cfg" "$mamedefconf"
+
+ sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "$mameconf" # one-off as roms folders are a lot
+ set_setting_value "$mameconf" "nvram_directory" "$saves_folder/mame-sa/nvram" "mame"
+ set_setting_value "$mameconf" "state_directory" "$states_folder/mame-sa" "mame"
+ set_setting_value "$mameconf" "snapshot_directory" "$screenshots_folder/mame-sa" "mame"
+ set_setting_value "$mameconf" "diff_directory" "$saves_folder/mame-sa/diff" "mame"
+ set_setting_value "$mameconf" "samplepath" "$bios_folder/mame-sa/samples" "mame"
+
+ log i "Placing cheats in \"/var/data/mame/cheat\""
+ unzip -j -o "$emuconfigs/mame/cheat0264.zip" 'cheat.7z' -d "/var/data/mame/cheat"
+
fi
- if [[ "$component" =~ ^(gzdoom|GZDOOM|all)$ ]]; then
+ if [[ "$component" =~ ^(gzdoom|all)$ ]]; then
# TODO: do a proper script
- # This is just a placeholder script to test the component's flow
- echo "----------------------"
- echo "Initializing GZDOOM"
- echo "----------------------"
+ # This is just a placeholder script to test the emulator's flow
+ log i "----------------------"
+ log i "Prepearing GZDOOM"
+ log i "----------------------"
+
+ create_dir "/var/config/gzdoom"
+ create_dir "/var/data/gzdoom/audio/midi"
+ create_dir "/var/data/gzdoom/audio/fm_banks"
+ create_dir "/var/data/gzdoom/audio/soundfonts"
+ create_dir "$rdhome/bios/gzdoom"
- mkdir -p "/var/config/gzdoom"
- mkdir -p "/var/data/gzdoom"
cp -fvr "$emuconfigs/gzdoom/gzdoom.ini" "/var/config/gzdoom"
- cp -fvr "$emuconfigs/gzdoom/gzdoom.pk3" "/var/data/gzdoom"
+ sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
sed -i 's#RETRODECKSAVESDIR#'$saves_folder'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
fi
- if [[ "$component" =~ ^(boilr|BOILR|all)$ ]]; then
- echo "----------------------"
- echo "Initializing BOILR"
- echo "----------------------"
+ if [[ "$component" =~ ^(boilr|all)$ ]]; then
+ log i "----------------------"
+ log i "Prepearing BOILR"
+ log i "----------------------"
- mkdir -p "/var/config/boilr"
+ create_dir "/var/config/boilr"
cp -fvr "/app/libexec/steam-sync/config.toml" "/var/config/boilr"
-
+ fi
+
+ if [[ ! "$component" =~ ^(retrodeck|es-de|retroarch|citra|citra-emu|cemu|dolphin|dolphin-emu|duckstation|melonds|melonDS|pcsx2|pico8|pico-8|ppsspp|primehack|rpcs3|ryujinx|yuzu|xemu|vita3k|mame|gzdoom|boilr|)$ ]]; then
+ log e "Supplied component $component not found, not resetting"
fi
# Update presets for all components after any reset or move
diff --git a/functions/presets.sh b/functions/presets.sh
index d214461a..19fcbcec 100644
--- a/functions/presets.sh
+++ b/functions/presets.sh
@@ -125,10 +125,10 @@ build_preset_config() {
fi
if [[ "$read_config_format" == "retroarch" && ! "$retroarch_all" == "true" ]]; then # If this is a RetroArch core, generate the override file
if [[ ! -f "$read_target_file" ]]; then
- mkdir -p "$(realpath "$(dirname "$read_target_file")")"
+ create_dir "$(realpath "$(dirname "$read_target_file")")"
echo "$read_setting_name = \""$new_setting_value"\"" > "$read_target_file"
else
- if [[ -z $(grep "$read_setting_name" "$read_target_file") ]]; then
+ if [[ -z $(grep -o -P "^$read_setting_name\b" "$read_target_file") ]]; then
add_setting "$read_target_file" "$read_setting_name" "$new_setting_value" "$read_config_format" "$section"
else
set_setting_value "$read_target_file" "$read_setting_name" "$new_setting_value" "$read_config_format" "$section"
diff --git a/functions/steam-sync/steam-sync.py b/functions/steam-sync/steam-sync.py
index c4ce90df..11b078b2 100644
--- a/functions/steam-sync/steam-sync.py
+++ b/functions/steam-sync/steam-sync.py
@@ -129,8 +129,8 @@ command_list_default={
"x68000": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/px68k_libretro.so",
"zx81": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/81_libretro.so",
"zxspectrum": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/fuse_libretro.so",
-"switch": "flatpak run --command=yuzu net.retrodeck.retrodeck -f -g",
-"n3ds": "flatpak run --command=citra net.retrodeck.retrodeck",
+"switch": "flatpak run --command=/var/data/ponzu/Yuzu/bin/yuzu net.retrodeck.retrodeck -f -g",
+"n3ds": "flatpak run --command=/var/data/ponzu/Citra/bin/citra-qt net.retrodeck.retrodeck",
"ps2": "flatpak run --command=pcsx2-qt net.retrodeck.retrodeck -batch",
"wiiu": "flatpak run --command=Cemu-wrapper net.retrodeck.retrodeck -g",
"gc": "flatpak run --command=dolphin-emu-wrapper net.retrodeck.retrodeck -b -e",
diff --git a/net.retrodeck.retrodeck.Configurator.desktop b/net.retrodeck.retrodeck.Configurator.desktop
index 1d45d4a4..466733c6 100644
--- a/net.retrodeck.retrodeck.Configurator.desktop
+++ b/net.retrodeck.retrodeck.Configurator.desktop
@@ -3,7 +3,7 @@ Name=RetroDECK Configurator
GenericName=RetroDECK Configuration Utility
Type=Application
Comment=A handy tool to change common RetroDECK settings
-Icon=net.retrodeck.retrodeck
+Icon=net.retrodeck.retrodeck.configurator
Exec=/bin/bash /app/tools/configurator.sh
Terminal=false
StartupNotify=false
diff --git a/net.retrodeck.retrodeck.appdata.xml b/net.retrodeck.retrodeck.appdata.xml
index 0f530fdd..ba2f06ca 100644
--- a/net.retrodeck.retrodeck.appdata.xml
+++ b/net.retrodeck.retrodeck.appdata.xml
@@ -46,12 +46,10 @@
NOTE: It can be run on Linux desktop right now but there will be some manual configurations needed for input, storage location and other tiny hickups.
INSTALLATION INSTRUCTIONS FOR THE STEAM DECK:
-
- 1. Start RetroDECK from the Desktop mode (only needed for the initial first time configuration)
- 2. Add RetroDECK to your Steam Library by pressing "Add a non-steam game to my library"
- 3. Download the offical RetroDECK controller profile from Steam
- 4. [OPTIONAL] Download Steam Grids graphics for RetroDECK with BoilR
-
+ 1. Start RetroDECK from the Desktop mode (only needed for the initial first time configuration)
+ 2. Add RetroDECK to your Steam Library by pressing "Add a non-steam game to my library"
+ 3. Download the offical RetroDECK controller profile from Steam
+ 4. [OPTIONAL] Download Steam Grids graphics for RetroDECK with BoilR
For more detailed information check our wiki:
https://github.com/XargonWan/RetroDECK/wiki
@@ -59,56 +57,104 @@
https://www.patreon.com/RetroDECK
If you want to join the RetroDECK community check our:
Reddit: https://www.reddit.com/r/RetroDECK/
- Discord: https://discord.gg/Dz3szYsP8g
+
Discord: https://discord.gg/WDc5C9YWMx
(If you want to help out with the project join the "i-want-to-help" channel)
+
+ #94a6fb
+ #404b98
+
GPL-3.0
CC0-1.0
-
- https://github.com/XargonWan/RetroDECK/releases/tag/0.8.0b
+
+ https://github.com/XargonWan/RetroDECK/releases/tag/0.8.1b
- CRITICAL:
-
- DEEP TEST: prepare_emulator function is now called prepare_component, eidted even in the cli and split it into the Configurator, so we need to test if the reset emulator works as supposed, if the cli and the Configurator is consistent.
-
Changes:
+ All emulators updated
+ PREPARE_COMPONENT: now the choice is passed lowercased so the script don't have to check for the possible casings, this should fix the issue where GZDoom couldn't be reset as it was expecting both GZDOOM or gzdoom.
+ ES-DE: downloaded_media, gamelist, and themes are now moved to the new retrodeck/ES-DE (previously was retrodeck)
+ ES-DE: custom collections are now located in retrodeck/ES-DE/collections, this prevents to be destroyed by a reset
+ LOGGER: version notes are no more outputed in the terminal or in the logs
+ WORKFLOWS: added RetroDECK.flatpak.sha files
+ WORKFLOWS: disabled nightly builds (was broken)
+ FRAMEWORK: now the PR builds are recognized same as cooker builds
+ FRAMEWORK: now there is a warning to check background windows, useful when installing RCPS3 firmware as some users were stuck on that screen without noticing the windows in the backgrounds
+ COOKER_UPDATER: added the hash check before uninstalling the flatpak
+ HELPER_FILES: updated links pointing to the new wiki
+ MAME-SA: added cheats
+ RYUJINX: added an helper file to specify how to install the firmware (not copying it in the folder)
+ RPCS3: included the confirm on quit preset, that can be enabled or disabled trough configurator like the other emulators
+ RETROARCH: fixed an issue where if a zip contained more than the game files it failed to load the game
+ CITRA_LIBRETRO: upscaled to 2x (was 4x but was too much), set system as "New 3DS"
+ GW_LIBRETRO: Handheld Electronic (GW) Libretro is now the defaulted Game And Watch emulator (due to a bug)
+ MESEN_LIBRETRO: enabled FDS disk auto load
+ SCUMMVM_LIBRETRO: provided assets
+ BIOS_CHECKER: added bios support for 3DO, GB, GBC, GBA, Neo Geo CD
+ BIOS_CHECKER: added more missing hashes
+
+ Known issues:
+
+ Please check the know issues in the Wiki under General Infomration.
+
+
+
+
+ https://github.com/XargonWan/RetroDECK/releases/tag/0.8.0b
+
+ Changes:
+
+ All the emulators and engines are updated to their latest version
+ ES-DE: updated to 3.0.1
+ RPCS3 is now running via shortcut (.desktop file) by default
+ CITRA-SA: removed, it will available trough Ponzu. The libretro core is now the default emulator
+ YUZU: removed, Ryujinx is now the default emulator, it will available trough Ponzu
+ PONZU: added, check the wiki if interested in this preservational function
+ Added new system: PSVita, trough Vita3K
Added new system: SOLARUS
- Added new engine: GZDOOM
- Added new emulator: Vita3K - Reset the emulator to grap the lates changes
- Added new emulator: MAME (Standalone)
- PPSSPP: added hotkeys
+ Added new engine: GZDOOM that is now the DOOM system default engine
+ Added new emulator: RYUJINX
+ Added new emulator: MAME (Standalone), v0.264
+ Added hotkeys for: PPSSPP, MAME, SCUMMVM
DOLPHIN: improved wiimote pointer emulation for controllers
- Added Steam Sync (with BoilR)
- Quit button after emulators reset should act as an actual full quit button
- Created a quit_retrodeck function to ease the quit in the scripts.
- Logs folder is now in retrodeck/logs (previously was .logs)
- The post update script is initializing vita3k, mame and boilr when coming from a version ealrier that 0.8.0, this don't work in cokker and must be resetted manually (for boilr reset RetroDECK)
- RPCS3 is now running via shortcut (.desktop file) by default - WARN THE USERS TO MIGRATE
- Added controller config for PS4 and PS5
- Controller config overhaul
- Removed talk names in the manifest as they're not needed anymore as enabled by default
+ DOLPHIN: enabled Gyro
+ PRIMEHACK: config structure refactor + new configs
+ LOGGER: logging is completely refactored, logs folder is now in retrodeck/logs (previously was .logs)
+ Added Steam controller layouts for PS4 and PS5
+ Steam controller layouts overhaul
+ DUCKSTATION: config refactor. The old config didn't not work anymore for controllers.
+ MULTIPLAYER: enabled controller configs for player 2~4 for CEMU, DUCKSTATION, GZDOOM, RPCS3 and RYUJINX
+ Graphical tweaks for DOLPHIN, MELONDS and PCSX2
+ Added a new icon for RetroDECK Configurator
+ CONFIGURATOR: added more systems to valid compression targets in the compressor tool
+ CONFIGURATOR: simplified single-file-compression process
+ CONFIGURATOR: merged "save state on exit" and "load state on run" presets into a new "Quick Resume" function
+ CONFIGURATOR: added a tool to "Swap A/B X/Y button" for compatible systems
+ CONFIGURATOR: moved "Rewind" preset to "Global Presets" section and added more compatible systems
+ CONFIGURATOR: added "expert mode" on BIOS checker tool (shows all available info)
+ DESKTOP: added Steam Flatpak detection for controller profile install
+ DESKTOP: RetroDECK now knows if it is running on a real Deck or other Linux desktop
+ DESKTOP: disabled "Desktop Mode" warning when not running on Deck
Fixes:
- Fixed DUCKSTATION memory card folder
- Fixed RPCS3 saves folder (wrong symlink) - WRN THE USERS TO BACKUP
- Fixed issues that prevents Steam Sync to work correctly
+ CEMU: refactored input profiles to reflect the new version changes
+ DUCKSTATION: fixed memory card folder path
+ DUCKSTATION: all controlls now are configured via SDL
+ RPCS3: fixed saves folder (wrong symlink) - WARN THE USERS TO BACKUP
+ SCUMMVM: fixed a bug where some paths were not existing
+ RETROARCH: fixed a bug where the default folder was not the rom folder in the rgui
+ DOLPHIN: tweaked Wii, GC and GBA inputs
+ Removed talk names in the manifest as they're not needed anymore as enabled by default
+ Fixed an issue that prevented RetroDECK to work properly on some distributions on Wayland
+ Added the needed subfolders in retrodeck/bios
+ DEVELOPER TOOLS: fixed some issues that preventing RetroDECK to be built locally
+ DEVELOPER TOOLS: added a script to inject changes in the current RetroDECK installation in order to test script and config changes without a full manifest rebuild
- Issues:
+ Known issues:
- !!! WARNING !!! Steam Sync is now REPLACING your Standalone BoilR links with RetroDECK's, use it at your own risk!
- GZDOOM: the controller for player 2+ is not correctly configured
- quit_retrodeck function seems to not working correctly
- MAME (Standalone) paths should be fixed
-
- Missing:
-
- GZDOOM: hotkeys
- SOLARUS: hotkeys
- MAME (Standalone): hotkeys
- A proper reset script for the new emulators, now it's just a draft (only Vita3K is done)
+ Please check the know issues in the Wiki under General Infomration.
@@ -130,7 +176,7 @@
-
+
https://github.com/XargonWan/RetroDECK/releases/tag/0.7.5b
Bug fixes and other changes:
@@ -208,13 +254,13 @@
Information:
- Steam Deck users update RetroDECK from Discover in Desktop Mode.
- Don't forget to reapply the latest controller layout: Go into the Templates tab and reapply the new profile ending with 0.7.1b (there is no need to reinstall the entire layout from the Configurator).
+ Steam Deck users update RetroDECK from Discover in Desktop Mode.
+ Don't forget to reapply the latest controller layout: Go into the Templates tab and reapply the new profile ending with 0.7.1b (there is no need to reinstall the entire layout from the Configurator).
Bug fixes and other changes:
Fixed an issue to make sure the RD controller layout file at update with each RD update.
- Fixed an issue with PPSSPP that made L and R incorrectly bound.
+ Fixed an issue with PPSSPP that made L and R incorrectly bound.
Fixed an issue in the Configurator that prevented the Yuzu preset for swapping A/B X/Y from working.
Fixed a notification issue on the latest SteamOS Beta releases.
Fixed an rsync permissions issue in the RetroDECK Framework.
@@ -227,18 +273,18 @@
Steam Deck - Global Controller Layout:
We have done some changes based on community feedback
- Select is now a hotkey trigger while pressing it down, L4 and R4 are still triggers as well.
- The RetroArch combo of Select + Start = Quit now works on many SA-Emulators.
- Open Menu is removed from Select .
- R5 = A button (this allows for great Wii controls on the right touchpad and pressing down the R5 for A).
- L5 = B button.
+ Select is now a hotkey trigger while pressing it down, L4 and R4 are still triggers as well.
+ The RetroArch combo of Select + Start = Quit now works on many SA-Emulators.
+ Open Menu is removed from Select.
+ R5 = A button (this allows for great Wii controls on the right touchpad and pressing down the R5 for A).
+ L5 = B button.
Global hotkey changes:
- Open Menu is on Y .
- Increase Emulation Speed is on Dpad-UP .
- Decrease Emulation Speed is on Dpad-Down .
- Fullscreen OFF command is removed (as emulators have migrated to toggle).
+ Open Menu is on Y.
+ Increase Emulation Speed is on Dpad-UP.
+ Decrease Emulation Speed is on Dpad-Down.
+ Fullscreen OFF command is removed (as emulators have migrated to toggle).
Known issues:
@@ -549,26 +595,26 @@
https://github.com/XargonWan/RetroDECK/releases/tag/0.4.3b
- Emulators:
+ Emulators:
Updated all the emulators at the latest available version.
- Backend:
+ Backend:
- Known Issues:
+ Known Issues:
PCSX2: due to its limitation, the standalone PCSX2 doesn't have any way to set the hotkeys, so no save and load state, no quit button. In order to quit press: STEAM -> PCSX2 -> (X) CLOSE WINDOW, be aware that the state is not automatically saved
Due to a Steam limitation, external controllers and keyboard seems not to be working, expecially in the desktop mode
- IMPORTANT NOTE:
+ IMPORTANT NOTE:
At the moment the emulator configs are reset during every update, this was made because every version they may bring new configurations, please back them up if you did some manual configs.
@@ -577,7 +623,7 @@
https://github.com/XargonWan/RetroDECK/releases/tag/0.4.2b
- Emulators:
+ Emulators:
Updated all the emulators at the latest available version.
@@ -588,7 +634,7 @@
RETROARCH (LIBRETRO): Tweaked some configs and fixed some overlapping hotkeys (FPS was same as Show Menu action).
- Backend:
+ Backend:
Removed some broken tools that will be reintroduced once fixed, including the roms moving tool.
@@ -596,14 +642,14 @@
Manifest trimmend and general code cleanup.
- Known Issues:
+ Known Issues:
PCSX2: due to its limitation, the standalone PCSX2 doesn't have any way to set the hotkeys, so no save and load state, no quit button. In order to quit press: STEAM -> PCSX2 -> (X) CLOSE WINDOW, be aware that the state is not automatically saved
Due to a Steam limitation, external controllers and keyboard seems not to be working, expecially in the desktop mode
- IMPORTANT NOTE:
+ IMPORTANT NOTE:
At the moment the emulator configs are reset during every update, this was made because every version they may bring new configurations, please back them up if you did some manual configs.
@@ -612,7 +658,7 @@
https://github.com/XargonWan/RetroDECK/releases/tag/0.4.1b
- Emulators:
+ Emulators:
Tweaked various emulator configs
@@ -620,7 +666,7 @@
Fixed home path in MelonDS (SA)
- Frontend:
+ Frontend:
Updated ES-DE to 1.2.4
@@ -628,13 +674,13 @@
Now a custom roms path can be selected if SD Card is selected and the SD Card is not found in the default path
- Backend:
+ Backend:
Fixed a bug where the folders where not symlinked correclty
- Known Issues:
+ Known Issues:
PCSX2: due to its limitation, the standalone PCSX2 doesn't have any way to set the hotkeys, so no save and load state, no quit button. In order to quit press: STEAM -> PCSX2 -> (X) CLOSE WINDOW, be aware that the state is not automatically saved
@@ -642,7 +688,7 @@
Yuzu makes RetroDECK freeze in some situations, like if the rom is a bad dump
- IMPORTANT NOTE:
+ IMPORTANT NOTE:
At the moment the emulator configs are reset during every update, this was made because every version they may bring new configurations, please back them up if you did some manual configs.
diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml
index 9d7a8236..ebca27e7 100644
--- a/net.retrodeck.retrodeck.yml
+++ b/net.retrodeck.retrodeck.yml
@@ -3,23 +3,18 @@ runtime: org.kde.Platform
runtime-version: "6.5"
sdk: org.kde.Sdk
sdk-extensions:
- - org.freedesktop.Sdk.Extension.llvm16 # Needed for rpcs3 (llvm15) but llvm16 for CITRA
+ - org.freedesktop.Sdk.Extension.llvm16 # Needed for RPCS3 (llvm17 actually)
- org.freedesktop.Sdk.Extension.rust-stable # Needed for BoilR
-# base: io.qt.qtwebengine.BaseApp # Needed for Yuzu - Disabled as we're using AppImage for Yuzu
-# base-version: "6.5" # Needed for Yuzu - Disabled as we're using AppImage for Yuzu
command: retrodeck.sh
finish-args:
- - --socket=fallback-x11
- --socket=wayland
+ - --socket=x11
- --socket=pulseaudio
- --share=ipc
- --share=network
- --device=all
- - --filesystem=home
- - --filesystem=/run/media
- - --filesystem=/media
- - --filesystem=/mnt
+ - --filesystem=host
- --filesystem=home/.var/app/com.valvesoftware.Steam
- --allow=multiarch
- --talk-name=org.freedesktop.ScreenSaver
@@ -27,10 +22,9 @@ finish-args:
- --talk-name=org.freedesktop.login1.Manager
- --filesystem=xdg-run/app/com.discordapp.Discord:create
- --filesystem=xdg-config/gtk-3.0:ro
- - --env=QT_QPA_PLATFORM=wayland-egl;wayland;xcb
+ - --env=QT_QPA_PLATFORM=wayland;wayland-egl;xcb
# Dolphin
- --allow=bluetooth
- # PPSSPP
# It allows an SDL application to specify its window class, which can be useful for window managers and desktop environments to identify and group similar windows
- --env=SDL_VIDEO_X11_WMCLASS=net.retrodeck.retrodeck
- --env=SDL_VIDEO_WAYLAND_WMCLASS=net.retrodeck.retrodeck
@@ -40,6 +34,8 @@ finish-args:
- --filesystem=xdg-data/Steam:rw #Steam (flatpak)
- --filesystem=~/.steam:rw # Steam (Non-flatpak)
- --filesystem=~/.var/app/com.valvesoftware.Steam:rw # Steam (Flatpak)
+ # PPSSPP, DOLPHIN
+ - --filesystem=xdg-run/gamescope-0:ro
cleanup:
# ES-DE
@@ -47,7 +43,6 @@ cleanup:
- /share/ffmpeg
- /lib/cmake
- /lib/pkgconfig
- # Yuzu
- /include
- /bin/glslangValidator
- /bin/zip*
@@ -61,14 +56,12 @@ cleanup:
# XMLSTARLET
- /lib/debug
- /share/runtime
-#cleanup-commands:
- # Yuzu
- #- /app/cleanup-BaseApp.sh
modules:
- # dependency of: CEMU, CITRA, DOLPHIN
- - rd-submodules/shared-modules/libusb/libusb.json
+ # dependency of: CEMU (1.0.26), DOLPHIN (1.0.27)
+ #- rd-submodules/shared-modules/libusb/libusb.json # 1.0.26
+ # we added the libusb 1.0.27 as Dolphin is breaking with 1.0.27, when bot will be aligned we can go back to the submodule
# This module is used to define the RetroDECK version
# If the version is set as cooker it will automatically generate the version tag based on the date
@@ -77,14 +70,14 @@ modules:
#
# UPDATE STEPS FOR MAIN:
# [ ] Update the VERSION variable on line containing "VERSION=THISBRANCH"
- # [ ] Update the appdata.xml with the version number and notes
+ # [x] Update the appdata.xml with the version number and notes
#
- name: version-initialization
buildsystem: simple
build-commands:
- |
- # on main please update this with the version variable, eg: VERSION='0.7.4b'
+ # on main please update this with the version variable, eg: VERSION=0.8.0b
# on cooker will be THISBRANCH
VERSION=THISBRANCH
@@ -169,17 +162,6 @@ modules:
url: https://ftp.osuosl.org/pub/blfs/conglomeration/libgudev/libgudev-237.tar.xz
sha256: 0d06b21170d20c93e4f0534dbb9b0a8b4f1119ffb00b4031aaeb5b9148b686aa
- - name: chdman-tool
- buildsystem: simple
- build-commands:
- - cmake -B . -G Ninja
- - cmake --build .
- - cp chdman /app/bin
- sources:
- - type: git
- url: https://github.com/CharlesThobe/chdman.git
- commit: f7cadf1720cbeba8a14f2685830ff424a0c7f6cd
-
- name: rclone
buildsystem: simple
build-commands:
@@ -228,7 +210,7 @@ modules:
url: https://github.com/mikefarah/yq/releases/download/v4.33.3/yq_linux_amd64
sha256: 4ee662847c588c3ef2fec8bfb304e8739e3dbaba87ccb9a608d691c88f5b64dc
- # dependency of: CEMU (13.1.1), CITRA (13.0.0)
+ # dependency of: CEMU
- name: glslang
buildsystem: cmake-ninja
config-opts:
@@ -241,10 +223,8 @@ modules:
- /lib/cmake
sources:
- type: archive
- url: https://github.com/KhronosGroup/glslang/archive/13.1.1.tar.gz
- sha256: 1c4d0a5a38c8aaf89a2d7e6093be734320599f5a6775b2726beeb05b0c054e66
- # url: https://github.com/KhronosGroup/glslang/archive/13.0.0.tar.gz
- # sha256: bcda732434f829aa74414ea0e06d329ec8ac28637c38a0de45e17c8fd25a4715
+ url: https://github.com/KhronosGroup/glslang/archive/14.1.0.tar.gz
+ sha256: b5e4c36d60eda7613f36cfee3489c6f507156829c707e1ecd7f48ca45b435322
x-checker-data:
type: anitya
stable-only: true
@@ -277,7 +257,7 @@ modules:
stable-only: true
url-template: https://www.freedesktop.org/software/libevdev/libevdev-$version.tar.xz
- # dependency of: CITRA, CEMU
+ # dependency of: CEMU
- name: rapidjson
buildsystem: cmake-ninja
config-opts:
@@ -343,10 +323,27 @@ modules:
url: https://gitlab.freedesktop.org/slirp/libslirp.git
tag: v4.7.0
+ # dependency of: CEMU (1.0.26), DOLPHIN (1.0.27)
+ - name: libusb
+ config-opts:
+ - --disable-static
+ cleanup:
+ - /include
+ - /lib/*.la
+ - /lib/pkgconfig
+ sources:
+ - type: archive
+ url: https://github.com/libusb/libusb/releases/download/v1.0.27/libusb-1.0.27.tar.bz2
+ sha256: ffaa41d741a8a3bee244ac8e54a72ea05bf2879663c098c82fc5757853441575
+ x-checker-data:
+ type: anitya
+ project-id: 1749
+ stable-only: true
+ url-template: https://github.com/libusb/libusb/releases/download/v$version/libusb-$version.tar.bz2
+
# ES-DE - START
# https://gitlab.com/es-de/emulationstation-de
- #This is disabled because we added the extension (line 11), check if the videos are ok.
- name: ffmpeg
config-opts:
- --disable-static
@@ -406,9 +403,7 @@ modules:
- '*.a'
- '*.la'
- # When updating this module remember to check those:
- # https://gitlab.com/es-de/emulationstation-de/-/blob/[VERSION]/resources/systems/unix/es_find_rules.xml
- # But we don't include them 1:1 as RetroDECK got some specific configs in some cases
+ # When updating this module remember to check those on the main repos:
- name: ES-DE
buildsystem: cmake-ninja
config-opts:
@@ -419,12 +414,8 @@ modules:
sources:
- type: git
url: https://github.com/XargonWan/RetroDECK-ES-DE
- branch: cebbeff3b5f834fd9adaeb1f5dc9e0da6b106599
+ branch: retrodeck-main
- type: shell
- commands:
- - sed -i 's#"EMULATIONSTATION-DE V" + Utils::String::toUpper(PROGRAM_VERSION_STRING)#"RetroDECK
- v'$(cat ${FLATPAK_DEST}/retrodeck/version)', ES-DE v" + Utils::String::toUpper(PROGRAM_VERSION_STRING)#g'
- es-app/src/guis/GuiMenu.cpp
# ES-DE - END
@@ -433,8 +424,8 @@ modules:
- name: art-book-next-es-de
buildsystem: simple
build-commands:
- - mkdir -p ${FLATPAK_DEST}/share/emulationstation/themes/art-book-next-es-de/
- - mv -f * ${FLATPAK_DEST}/share/emulationstation/themes/art-book-next-es-de/
+ - mkdir -p ${FLATPAK_DEST}/share/es-de/themes/art-book-next-es-de/
+ - mv -f * ${FLATPAK_DEST}/share/es-de/themes/art-book-next-es-de/
sources:
- type: git
url: https://github.com/anthonycaccese/art-book-next-es-de.git
@@ -451,15 +442,17 @@ modules:
config-opts:
- '--enable-dbus'
make-args:
- - 'GLOBAL_CONFIG_DIR=${FLATPAK_DEST}/etc'
+ - GLOBAL_CONFIG_DIR=${FLATPAK_DEST}/etc
- HAVE_TRANSLATE=1
- HAVE_ACCESSIBILITY=1
sources:
- type: git
- url: 'https://github.com/libretro/RetroArch.git'
- commit: 712b9350a5c2b1b9129d939a2ae622093dfabd04
+ url: https://github.com/libretro/RetroArch.git
+ commit: 06fa5325f8b3cd42e6fba3d57835d5924c9ea2e7
- type: file
path: rd-submodules/retroarch/retroarch.cfg
+ - type: file
+ path: rd-submodules/retroarch/VkLayer_FROG_gamescope_wsi.x86_64.json
post-install:
- mkdir -p ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/
- >-
@@ -470,8 +463,12 @@ modules:
- >-
sed s:@prefix@:${FLATPAK_DEST}:g retroarch.cfg >
${FLATPAK_DEST}/etc/retroarch.cfg
+ - mkdir -p ${FLATPAK_DEST}/share/vulkan/implicit_layer.d
+ - >-
+ install VkLayer_FROG_gamescope_wsi.x86_64.json
+ /app/share/vulkan/implicit_layer.d/VkLayer_FROG_gamescope_wsi.x86_64.json
modules:
- - rd-submodules/retroarch/modules/libpng/libpng-1.6.35.json
+ - rd-submodules/retroarch/modules/libpng/libpng-1.6.json
- rd-submodules/retroarch/modules/nvidia-cg-toolkit/nvidia-cg-toolkit-3.1.0013.json
- rd-submodules/shared-modules/SDL/SDL-1.2.15.json
- rd-submodules/shared-modules/SDL/SDL_image-1.2.12.json
@@ -482,55 +479,56 @@ modules:
# certificate glu issue
#- rd-submodules/shared-modules/gudev/gudev.json
- rd-submodules/retroarch/modules/libbz2/libbz2-1.0.8.json
- - rd-submodules/retroarch/modules/xrandr/xrandr-1.5.1.json
+ - rd-submodules/retroarch/modules/xrandr/xrandr-1.5.json
- rd-submodules/retroarch/modules/libaio/libaio-0.3.112.json
# certificate issue, check glu module for more info
#- rd-submodules/shared-modules/glu/glu-9.json
- - rd-submodules/shared-modules/libdecor/libdecor-0.1.1.json
+ - rd-submodules/shared-modules/libdecor/libdecor.json
+ - rd-submodules/retroarch/modules/gamemode/gamemode-1.8.json
- name: retroarch-filers-video
subdir: gfx/video_filters
make-install-args:
- PREFIX=${FLATPAK_DEST}
sources:
- type: git
- url: 'https://github.com/libretro/RetroArch.git'
- commit: 712b9350a5c2b1b9129d939a2ae622093dfabd04
+ url: https://github.com/libretro/RetroArch.git
+ commit: 06fa5325f8b3cd42e6fba3d57835d5924c9ea2e7
- name: retroarch-filers-audio
subdir: libretro-common/audio/dsp_filters
make-install-args:
- PREFIX=${FLATPAK_DEST}
sources:
- type: git
- url: 'https://github.com/libretro/RetroArch.git'
- commit: 712b9350a5c2b1b9129d939a2ae622093dfabd04
+ url: https://github.com/libretro/RetroArch.git
+ commit: 06fa5325f8b3cd42e6fba3d57835d5924c9ea2e7
- name: retroarch-assets
make-install-args:
- PREFIX=${FLATPAK_DEST}
sources:
- type: git
- url: 'https://github.com/libretro/retroarch-assets.git'
- commit: 7b735ef18bcc6508b1c9a626eb237779ff787179
+ url: https://github.com/libretro/retroarch-assets.git
+ commit: 923b711dc6772a168d83dc8915e9260730fcf3a1
- name: libretro-database
make-install-args:
- PREFIX=${FLATPAK_DEST}
sources:
- type: git
- url: 'https://github.com/libretro/libretro-database.git'
- commit: e3b5cb00da4f3ab99491bf67c19630ffa7ee19f2
+ url: https://github.com/libretro/libretro-database.git
+ commit: 977612e2cd284f67fc0d121d9d94c5982a49f61e
- name: libretro-core-info
make-install-args:
- PREFIX=${FLATPAK_DEST}
sources:
- type: git
- url: 'https://github.com/libretro/libretro-core-info.git'
- commit: dacae85b406131feb12395a415fdf57fc4745201
+ url: https://github.com/libretro/libretro-core-info.git
+ commit: ad0f67e172dca9edb88a4eea1d541f407a9c2d12
- name: retroarch-joypad-autoconfig
make-install-args:
- PREFIX=${FLATPAK_DEST}
sources:
- type: git
- url: 'https://github.com/libretro/retroarch-joypad-autoconfig.git'
- commit: 5666e46bb89caf4e9af358fdb97a2b384cb62f36
+ url: https://github.com/libretro/retroarch-joypad-autoconfig.git
+ commit: ec43cfef730f15d6b20bf277681250b2f4b99a8b
- name: common-shaders
make-install-args:
- PREFIX=${FLATPAK_DEST}
@@ -543,22 +541,22 @@ modules:
- PREFIX=${FLATPAK_DEST}
sources:
- type: git
- url: 'https://github.com/libretro/slang-shaders.git'
- commit: 9266fa24b64b274fd429b73469ded3561de7b8f4
+ url: https://github.com/libretro/slang-shaders.git
+ commit: d367f6cf73e01a8e43028107ab1ded2d2f05fe6a
- name: glsl-shaders
make-install-args:
- PREFIX=${FLATPAK_DEST}
sources:
- type: git
- url: 'https://github.com/libretro/glsl-shaders.git'
- commit: c26b9e1913eda8c25d6cd218818745a3b451f982
+ url: https://github.com/libretro/glsl-shaders.git
+ commit: db974e4d6f6e3178198b7690095a107b3b509d4b
- name: common-overlays
make-install-args:
- PREFIX=${FLATPAK_DEST}
sources:
- type: git
- url: 'https://github.com/libretro/common-overlays.git'
- commit: 115d8670c2e032e4a41ba45f766f5cfd9dae28b8
+ url: https://github.com/libretro/common-overlays.git
+ commit: c266abf4d7f9286fb6fbcfb57647cd9c80c45530
# RetroArch - END
@@ -567,7 +565,8 @@ modules:
- name: retroarch-cores-nightly
buildsystem: simple
build-commands:
- - mkdir -p /app/share/libretro/cores/
+ - mkdir -p /app/share/libretro/cores/
+
- mv -f ./RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores/* /app/share/libretro/cores/
sources:
- type: archive
@@ -577,12 +576,12 @@ modules:
- name: retroarch-cores
buildsystem: simple
build-commands:
- - mkdir -p /app/share/libretro/cores/
+ - mkdir -p /app/share/libretro/cores/
- mv -f ./RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores/* /app/share/libretro/cores/
sources:
- type: archive
- url: https://buildbot.libretro.com/stable/1.16.0/linux/x86_64/RetroArch_cores.7z
- sha256: a149d34662516d791e8f90507d1107949cb158196d6bbf75105c649fb26504b6
+ url: https://buildbot.libretro.com/stable/1.17.0/linux/x86_64/RetroArch_cores.7z
+ sha256: 1c1d61f86b196e9f89c1a93d0756fba95b60ef3ba57a7cd1d1e86dfd419c766b
- name: retroarch-sameduck-core
buildsystem: simple
@@ -652,8 +651,8 @@ modules:
sources:
- type: git
url: &ppsspp-url https://github.com/hrydgard/ppsspp.git
- tag: v1.17
- commit: 493122a2fcf9ff538e242fe2844f019b53afd483
+ tag: v1.17.1
+ commit: d479b74ed9c3e321bc3735da29bc125a2ac3b9b2
x-checker-data:
type: json
url: https://api.github.com/repos/hrydgard/ppsspp/releases/latest
@@ -663,90 +662,6 @@ modules:
# PPSSPP - END
- # Yuzu - START
- # https://github.com/yuzu-emu/yuzu-mainline/releases
-
- - name: Yuzu
- buildsystem: simple
- build-commands:
- - chmod +x yuzu*.AppImage
- - ./yuzu*.AppImage --appimage-extract
- - mkdir -p "${FLATPAK_DEST}/yuzu"
- - cp -r squashfs-root/* "${FLATPAK_DEST}/yuzu"
- - ln -s "${FLATPAK_DEST}/yuzu/usr/bin/yuzu" "${FLATPAK_DEST}/bin/yuzu"
- sources:
- - type: file
- url: https://github.com/yuzu-emu/yuzu-mainline/releases/download/mainline-0-1696/yuzu-mainline-20240128-1bd7a09e3.AppImage
- sha256: d8ca508daa5ba929efda956488f4a9cbc38df9fd672fcb55cb2184625971706d
-
- # Yuzu - END
-
- # CITRA - START
- # https://github.com/flathub/org.citra_emu.citra
-
- - rd-submodules/shared-modules/SDL2/SDL2-with-libdecor.json
-
- - rd-submodules/shared-modules/SDL2/SDL2-with-libdecor.json
-
- - name: citra
- buildsystem: cmake-ninja
- builddir: true
- build-options:
- env:
- CI: '1'
- GITHUB_ACTIONS: '1'
- GITHUB_REPOSITORY: citra-emu/citra-nightly
- GITHUB_REF_NAME: nightly-2025
- append-path: /usr/lib/sdk/llvm16/bin
- prepend-ld-library-path: /usr/lib/sdk/llvm16/lib
- cflags: '-Wno-unused-command-line-argument'
- cxxflags: '-Wno-unused-command-line-argument'
- config-opts:
- - '-DCMAKE_BUILD_TYPE=Release'
- - '-DCMAKE_C_COMPILER=clang'
- - '-DCMAKE_CXX_COMPILER=clang++'
- - '-DCMAKE_LINKER=lld'
- - '-DENABLE_QT_TRANSLATION=ON'
- - '-DCITRA_ENABLE_COMPATIBILITY_REPORTING=ON'
- - '-DUSE_DISCORD_PRESENCE=ON'
- - '-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF'
- - '-DUSE_SYSTEM_SDL2=ON'
- cleanup:
- - /share/man
- - /share/pixmaps
- post-install:
- - install -Dm755 ../citra-launcher.sh /app/bin/citra-launcher
- - >-
- install -Dm644 ../org.citra_emu.citra.svg
- /app/share/icons/hicolor/scalable/apps/citra.svg
- - >-
- install -Dm644 ../dist/icon.png
- /app/share/icons/hicolor/512x512/apps/citra.png
- - >-
- mv /app/share/mime/packages/citra.xml
- /app/share/mime/packages/org.citra_emu.citra.xml
- - >-
- sed 's/citra/org.citra_emu.citra/g' -i
- /app/share/mime/packages/org.citra_emu.citra.xml
- sources:
- - type: archive
- url: >-
- https://github.com/citra-emu/citra-nightly/releases/download/nightly-2025/citra-unified-source-20231105-998b9a9.tar.xz
- sha256: ebf52af66c6ef729688a29d093d9139baa76973b698c0630a295f38d126cf118
- x-checker-data:
- type: json
- url: https://api.github.com/repos/citra-emu/citra-nightly/releases/latest
- version-query: .tag_name
- url-query: >-
- .assets[] | .browser_download_url |
- match("https://.+citra-unified-source-.+.xz$") | .string
- is-main-source: true
- - type: file
- path: rd-submodules/citra/org.citra_emu.citra.svg
- - type: file
- path: rd-submodules/citra/citra-launcher.sh
-
- # CITRA - END
# PCSX2 - START
# Inspired by:
@@ -763,8 +678,8 @@ modules:
- ln -s "${FLATPAK_DEST}/pcsx2-qt/usr/bin/pcsx2-qt" "${FLATPAK_DEST}/bin/pcsx2-qt"
sources:
- type: file
- url: https://github.com/PCSX2/pcsx2/releases/download/v1.7.5284/pcsx2-v1.7.5284-linux-appimage-x64-Qt.AppImage
- sha256: b3cb23e07435f7efe7145cddd0cf4d473cc65eee8feae436b8a718fc3017721a
+ url: https://github.com/PCSX2/pcsx2/releases/download/v1.7.5769/pcsx2-v1.7.5769-linux-appimage-x64-Qt.AppImage
+ sha256: d819a339b9f3c43ee44fe9b6d975b9f76cff7716b5976a3b94f77e2cf4cab667
# PCSX2 - END
@@ -894,8 +809,8 @@ modules:
sources:
- type: git
url: https://github.com/xemu-project/xemu.git
- tag: v0.7.116
- commit: b3fc80b3a83fa99aeb541a0c665cfb596cedd71c
+ tag: v0.7.120
+ commit: 94d826a4f125d755d6d37069ad7084bfde33d650
x-checker-data:
type: json
url: https://api.github.com/repos/xemu-project/xemu/releases/latest
@@ -922,13 +837,9 @@ modules:
- name: melonds
buildsystem: cmake-ninja
builddir: true
- config-opts:
- - -DUSE_QT6=ON
build-options:
- arch:
- aarch64:
- config-opts:
- - -DENABLE_LTO_RELEASE=OFF
+ config-opts:
+ - -DUSE_QT6=ON
sources:
- type: git
url: https://github.com/melonDS-emu/melonDS.git
@@ -945,6 +856,9 @@ modules:
buildsystem: cmake-ninja
builddir: true
build-options:
+ # llvm17 is not available in framework 6.5 but in 6.6, so we're trying llvm16 and cross our fingers until Primehack is updated (as Primehack breaks on 6.6)
+ #append-ld-library-path: /usr/lib/sdk/llvm17/lib
+ #append-path: /usr/lib/sdk/llvm17/bin
append-ld-library-path: /usr/lib/sdk/llvm16/lib
append-path: /usr/lib/sdk/llvm16/bin
cflags: &optflags -O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong
@@ -972,6 +886,7 @@ modules:
- -DUSE_SYSTEM_ZLIB=ON
- -Wno-dev
post-install:
+ #- cp /usr/lib/sdk/llvm17/lib/libLLVM-17.so /app/lib/
- cp /usr/lib/sdk/llvm16/lib/libLLVM-16.so /app/lib/
- |-
set -eux
@@ -981,7 +896,7 @@ modules:
sources:
- type: git
url: https://github.com/RPCS3/rpcs3.git
- commit: f9d213650cfe4733937c43d93de91a17f8582820
+ commit: 4ecf8ecd06c15f0557e1d9243f31e4c2d7baebe2
# RPCS3 - END
@@ -1046,6 +961,7 @@ modules:
# Duckstation-AppImage - END
# Cemu - START
+ # needed libusb 1.0.26 but we provide 1.0.27, it could break
# https://github.com/cemu-project/Cemu/releases
# https://github.com/flathub/info.cemu.Cemu
@@ -1072,8 +988,8 @@ modules:
- /lib/cmake
sources:
- type: archive
- url: https://boostorg.jfrog.io/artifactory/main/release/1.83.0/source/boost_1_83_0.tar.bz2
- sha256: 6478edfe2f3305127cffe8caf73ea0176c53769f4bf1585be237eb30798c3b8e
+ url: https://boostorg.jfrog.io/artifactory/main/release/1.85.0/source/boost_1_85_0.tar.bz2
+ sha256: 7009fe1faa1697476bdc7027703a2badb84e849b7b0baad5086b087b971f8617
x-checker-data:
type: anitya
project-id: 6845
@@ -1143,9 +1059,6 @@ modules:
config-opts:
- -DPORTABLE=false
- -DENABLE_VCPKG=false
- build-options:
- env:
- - LC_ALL=C
sources:
- type: git
url: https://github.com/cemu-project/Cemu
@@ -1153,8 +1066,8 @@ modules:
x-checker-data:
type: git
tag-pattern: ^v([\d.]+-\d+)$
- tag: v2.0-61
- commit: b6aaf6633063be47d89a8216e269e32aec5a4b49
+ tag: v2.0-79
+ commit: efbbb817fe1cbe09ee132344b44a0f61f8b8ac96
- type: shell
commands:
- sed "s/set(EXPERIMENTAL_VERSION.*/set(EXPERIMENTAL_VERSION \"$(git describe
@@ -1275,9 +1188,12 @@ modules:
tag: v1.6.5
commit: 3aec70b0556a8d7aed7903d1a3e4d9a18c5d1649
- - rd-submodules/shared-modules/gzdoom/gzdoom.json
-
# SOLARUS - END
+
+ # GZDoom - Start
+ # When updating remember to update all the .pk3 files from the standalone linux download
+ - rd-submodules/shared-modules/gzdoom/gzdoom.json
+ # GZDoom - END
# MAME - Start
@@ -1292,6 +1208,23 @@ modules:
# MAME - End
+ # Ryujinx Appimage - START
+ # https://ryujinx.org/download
+
+ - name: Ryujinx
+ buildsystem: simple
+ build-commands:
+ - |
+ tar -zxvf *.tar.gz
+ mv -v publish ${FLATPAK_DEST}/ryujinx
+ ln -sv ${FLATPAK_DEST}/ryujinx/Ryujinx ${FLATPAK_DEST}/bin/Ryujinx.sh
+ sources:
+ - type: file
+ url: https://github.com/Ryujinx/release-channel-master/releases/download/1.1.1297/ryujinx-1.1.1297-linux_x64.tar.gz
+ sha256: 28b38754e7d2e92083b313b23278c180ae54ac025edbbd0276ec03baec0cec0f
+
+ # Ryujinx Appimage - END
+
# External manifests end
- name: retrodeck
@@ -1301,21 +1234,17 @@ modules:
# Initializing RO retrodeck config folder
- mkdir -p ${FLATPAK_DEST}/retrodeck
- # Prep the ES-DE and RetroArch config files - I will have to SED/XMLSTARLET them soon
- - rm -rf /app/share/emulationstation/resources/systems/unix/es_find_rules.xml
- - cp es-configs/es_find_rules.xml /app/share/emulationstation/resources/systems/unix/
- - rm -rf /app/share/emulationstation/resources/systems/unix/es_systems.xml
- - cp es-configs/es_systems.xml /app/share/emulationstation/resources/systems/unix/
# These must be put in home folder, managed by retrodeck.sh
- cp es-configs/es_settings.xml ${FLATPAK_DEST}/retrodeck/es_settings.xml
- mv -f -t ${FLATPAK_DEST}/retrodeck es-configs/rd_prepacks
# Logo, res, move graphics directory away from default location so splash can be changed after build
- - mv -f -t ${FLATPAK_DEST}/retrodeck /app/share/emulationstation/resources/graphics
+ - mv -f -t ${FLATPAK_DEST}/retrodeck /app/share/es-de/resources/graphics
- cp -f res/splash.svg ${FLATPAK_DEST}/retrodeck/graphics/splash.svg
- cp -f res/splash.svg ${FLATPAK_DEST}/retrodeck/graphics/splash-orig.svg
- cp -rf res/extra_splashes/ ${FLATPAK_DEST}/retrodeck/graphics
- cp -f res/icon.svg /app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg
+ - cp -f res/icon-configurator.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.configurator.svg
- mv -f -t ${FLATPAK_DEST}/retrodeck res/binding_icons
# RetroDECK core script
@@ -1325,7 +1254,7 @@ modules:
# Tools
- mkdir -p /app/tools
- cp -r tools/** /app/tools
- - find /app/tools -name '*.py|*.sh' -exec chmod +x {} \;
+ - find /app/tools -type f \( -name "*.sh" -o -name "*.py" \) -exec chmod +x {} \;
# Function libraries
- mkdir -p /app/libexec
diff --git a/automation_tools/flatpak_build_bundle_persistent.sh b/old/automation_tools/flatpak_build_bundle_persistent.sh
similarity index 100%
rename from automation_tools/flatpak_build_bundle_persistent.sh
rename to old/automation_tools/flatpak_build_bundle_persistent.sh
diff --git a/automation_tools/flatpak_build_download_only_persistent.sh b/old/automation_tools/flatpak_build_download_only_persistent.sh
similarity index 100%
rename from automation_tools/flatpak_build_download_only_persistent.sh
rename to old/automation_tools/flatpak_build_download_only_persistent.sh
diff --git a/automation_tools/flatpak_build_only_persistent.sh b/old/automation_tools/flatpak_build_only_persistent.sh
similarity index 93%
rename from automation_tools/flatpak_build_only_persistent.sh
rename to old/automation_tools/flatpak_build_only_persistent.sh
index 4121cf9f..d9dc99ef 100755
--- a/automation_tools/flatpak_build_only_persistent.sh
+++ b/old/automation_tools/flatpak_build_only_persistent.sh
@@ -19,6 +19,8 @@ mkdir -vp ${$BUILD_DIR}/"$FOLDER"
flatpak-builder --user --force-clean \
--install-deps-from=flathub \
--install-deps-from=flathub-beta \
+--keep-build-dirs \
+--rebuild-on-sdk-change \
--repo="${BUILD_DIR}/.local" \
--disable-download \
"${BUILD_DIR}/${FOLDER}" \
diff --git a/.github/workflows/removed/TEST_release_info.yml b/old/disabled-workflows/TEST_release_info.yml
similarity index 100%
rename from .github/workflows/removed/TEST_release_info.yml
rename to old/disabled-workflows/TEST_release_info.yml
diff --git a/old/disabled-workflows/cooker-selfhosted-persistent.yml b/old/disabled-workflows/cooker-selfhosted-persistent.yml
new file mode 100644
index 00000000..711deb76
--- /dev/null
+++ b/old/disabled-workflows/cooker-selfhosted-persistent.yml
@@ -0,0 +1,210 @@
+name: "Build cooker (persistent)"
+
+env:
+ PERSISTENCE: true
+
+on:
+ push:
+ branches:
+ - cooker*
+ - feat*
+ paths:
+ - '.github/workflows/**'
+ - 'automation_tools/**'
+ - 'emu-configs/**'
+ - 'es-configs/**'
+ - 'functions/**'
+ - 'rd-submodules/**'
+ - '*.sh'
+ - 'net.retrodeck.retrodeck.yml'
+ - 'net.retrodeck.retrodeck.appdata.xml'
+ pull_request:
+ branches:
+ - cooker*
+
+ workflow_dispatch:
+
+jobs:
+
+ Building_RetroDECK:
+ runs-on: self-hosted
+ steps:
+
+ # Circumventing this bug: https://github.com/flatpak/flatpak-builder/issues/317
+ - name: Remove stuck mounts
+ run: sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
+ continue-on-error: true
+
+ - name: Clone RetroDECK repo
+ uses: actions/checkout@v3
+ with:
+ submodules: 'true'
+
+ - name: "Install dependencies"
+ run: "automation_tools/install_dependencies.sh"
+
+ - name: Generate cooker build ID
+ run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh"
+
+ - name: Get branch name
+ id: branch_name
+ run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV
+
+ # if it's a feature branch it will not marked as "latest" cooker version
+ - name: "Set makeLatest (cooker only)"
+ run: |
+ if [[ "$BRANCH_NAME" == 'feat/'* || "$BRANCH_NAME" == 'refs/'* ]]; then
+ echo "MAKE_LATEST=false" >> $GITHUB_ENV
+ else
+ echo "MAKE_LATEST=true" >> $GITHUB_ENV
+ fi
+
+ # if the branch is coming from a PR the tag should be manually built
+ - name: "Generate version tag"
+ run: |
+ if [[ "$BRANCH_NAME" == 'refs/'* ]]; then
+ pr_number=$(echo ${{env.BRANCH_NAME}} | awk -F'/' '{print $3}')
+ source_branch=$(curl -s "https://api.github.com/repos/XargonWan/RetroDECK/pulls/$pr_number" | jq -r '.head.ref')
+ source_branch=${source_branch//\//-}
+ echo "[DEBUG] source branch is: $source_branch"
+ echo "TAG=PR-$pr_number-$source_branch-${{ env.buildid }}" >> $GITHUB_ENV
+ else
+ echo "TAG=${{env.BRANCH_NAME}}-${{ env.buildid }}" >> $GITHUB_ENV
+ fi
+ echo "Version TAG: ${{ env.TAG }}"
+
+ # backing up manifest in case download fails and hashes must be recalculated
+ - name: Manifest backup
+ run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
+
+ - name: Run pre-build automation tasks
+ run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
+
+ - name: "Adding flatpak portal for automated updates (cooker only)"
+ run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_flatpak_portal_add.sh"
+
+ - name: "Updating release notes in appdata"
+ run: "automation_tools/appdata_management.sh"
+
+ - name: "[DEBUG] Outputting manifest"
+ run: cat net.retrodeck.retrodeck.yml
+
+ - name: "Build flatpak: download only"
+ id: "flatpak-download"
+ run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh"
+ continue-on-error: true
+
+ # Sometimes flatpak download fails, in this case it tries a second time
+ - name: "Build flatpak: download only (retry)"
+ if: steps.flatpak-download.outcome == 'failure'
+ run: |
+ echo "Download failed, maybe some hash changed since the build start."
+ echo "Recalculating hashes and retrying download..."
+ rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
+ cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
+ "${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
+ "${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh"
+
+ - name: Build flatpak
+ run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only_persistent.sh"
+
+ - name: Create Artifact for flathub
+ run: |
+ tar -czf ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.tar.gz -C ${GITHUB_WORKSPACE}/retrodeck-flatpak-cooker .
+ hash=($(sha256sum ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.tar.gz))
+ echo $hash > ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.sha
+ mv -f RetroDECK-Artifact-cooker.* ${{ secrets.ARTIFACT_REPO }}
+ continue-on-error: true
+
+ - name: Create Bundle
+ run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle_persistent.sh"
+
+ - name: Set environment variable with current branch name
+ run: echo "GITHUB_REF_SLUG=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
+
+ - name: Get commits since last release
+ run: |
+ # Get the latest release tag
+ LATEST_TAG=$(git describe --tags --abbrev=0)
+ # Get all commits since the latest release tag
+ COMMITS=$(git log $LATEST_TAG..HEAD --pretty=format:"- %s")
+ # Set the output variable
+ echo "::set-output name=commits::$COMMITS"
+ id: commits
+ continue-on-error: true
+
+ - name: Publish the flatpak in a new cooker release
+ uses: ncipollo/release-action@v1
+ with:
+ tag: "${{env.TAG}}"
+ body: |
+ # Release Notes (Cooker)
+ This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
+ On branch [${{env.BRANCH_NAME}}](https://github.com/XargonWan/RetroDECK/tree/${{env.BRANCH_NAME}}).
+
+ ## Commits since last release
+ ${{ steps.commits.outputs.commits }}
+
+ For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server.
+
+ Cooker channel is provided for the community to test fixes and explore new functionality.
+ Please DO NOT open issues or ask support on this build.
+
+ artifacts: "RetroDECK-cooker.flatpak,RetroDECK-Artifact.tar.gz"
+ allowUpdates: true
+ makeLatest: ${{env.MAKE_LATEST}} # if it's a feat branch is not considered the latest build
+ token: ${{ secrets.TRIGGER_BUILD_TOKEN }}
+ repo: RetroDECK-cooker
+ continue-on-error: true
+
+ # In case it cannot publish the release at least it's providing the flatpak file for creating a manual release
+ - name: Upload RetroDECK-cooker.flatpak
+ uses: actions/upload-artifact@v3
+ with:
+ name: retrodeck-flatpak
+ path: RetroDECK-cooker.flatpak
+ continue-on-error: true
+
+ # - name: Upload RetroDECK-cooker.flatpak to Gitea Release
+ # run: |
+ # # Set variables for Gitea host, organization, repository, access token, and release details
+ # GITEA_HOST="repo.retrodeck.net"
+ # ORGANIZATION="RetroDECK"
+ # REPO="RetroDECK-cooker"
+ # GITEA_TOKEN="${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}"
+ # RELEASE_NAME="RetroDECK ${{env.TAG}}"
+ # TAG="${{env.TAG}}"
+ # RELEASE_BODY="# Release Notes (Cooker)
+ # This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
+ # On branch [${{env.BRANCH_NAME}}](https://repo.retrodeck.net/RetroDECK/RetroDECK/src/branch/${{env.BRANCH_NAME}}).
+
+ # ## Commits since last release
+ # ${{ steps.commits.outputs.commits }}
+
+ # For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server.
+
+ # Cooker channel is provided for the community to test fixes and explore new functionality.
+ # Please DO NOT open issues or ask support on this build."
+
+ # # Create a release using curl and capture the release ID
+ # release_response=$(curl -X POST \
+ # -H "Authorization: token ${GITEA_TOKEN}" \
+ # -H "Content-Type: application/json" \
+ # -d "{\"tag_name\":\"$TAG\",\"name\":\"$RELEASE_NAME\",\"body\":\"$RELEASE_BODY\"}" \
+ # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases")
+
+ # # Extract the release ID from the response
+ # release_id=$(echo $release_response | jq -r '.id')
+
+ # # Upload artifacts
+ # curl -X POST \
+ # -H "Authorization: token ${GITEA_TOKEN}" \
+ # -H "Content-Type: multipart/form-data" \
+ # -F "attachment=@RetroDECK-cooker.flatpak" \
+ # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak"
+
+ # curl -X POST \
+ # -H "Authorization: token ${GITEA_TOKEN}" \
+ # -H "Content-Type: multipart/form-data" \
+ # -F "attachment=@RetroDECK-Artifact.tar.gz" \
+ # "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-Artifact.tar.gz"
diff --git a/.github/workflows/cooker-selfhosted-persistent.yml b/old/disabled-workflows/cooker-selfhosted.yml
similarity index 78%
rename from .github/workflows/cooker-selfhosted-persistent.yml
rename to old/disabled-workflows/cooker-selfhosted.yml
index 9cd619d7..2931fac4 100644
--- a/.github/workflows/cooker-selfhosted-persistent.yml
+++ b/old/disabled-workflows/cooker-selfhosted.yml
@@ -1,29 +1,32 @@
-name: "Build cooker (persistent)"
-
-env:
- PERSISTENCE: true
+name: "Build cooker"
on:
- push:
- branches:
- - cooker*
- - feat*
- paths:
- - '.github/workflows/**'
- - 'automation_tools/**'
- - 'emu-configs/**'
- - 'es-configs/**'
- - 'functions/**'
- - 'rd-submodules/**'
- - '*.sh'
- - 'net.retrodeck.retrodeck.yml'
- - 'net.retrodeck.retrodeck.appdata.xml'
- pull_request:
- branches:
- - cooker*
+ # push:
+ # branches:
+ # - cooker*
+ # - feat*
+ # paths:
+ # - '.github/workflows/**'
+ # - 'automation_tools/**'
+ # - 'emu-configs/**'
+ # - 'es-configs/**'
+ # - 'functions/**'
+ # - 'rd-submodules/**'
+ # - '*.sh'
+ # - 'net.retrodeck.retrodeck.yml'
+ # - 'net.retrodeck.retrodeck.appdata.xml'
+ # pull_request:
+ # branches:
+ # - cooker*
+
+ # Italy (CET): 11:00 PM
+ # Japan (JST): 7:00 AM
+ schedule:
+ - cron: '0 22 * * *'
workflow_dispatch:
+
jobs:
Building_RetroDECK:
@@ -46,33 +49,6 @@ jobs:
- name: Generate cooker build ID
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh"
- - name: Get branch name
- id: branch_name
- run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV
-
- # if it's a feature branch it will not marked as "latest" cooker version
- - name: "Set makeLatest (cooker only)"
- run: |
- if [[ "$BRANCH_NAME" == 'feat/'* || "$BRANCH_NAME" == 'refs/'* ]]; then
- echo "MAKE_LATEST=false" >> $GITHUB_ENV
- else
- echo "MAKE_LATEST=true" >> $GITHUB_ENV
- fi
-
- # if the branch is coming from a PR the tag should be manually built
- - name: "Generate version tag"
- run: |
- if [[ "$BRANCH_NAME" == 'refs/'* ]]; then
- pr_number=$(echo ${{env.BRANCH_NAME}} | awk -F'/' '{print $3}')
- source_branch=$(curl -s "https://api.github.com/repos/XargonWan/RetroDECK/pulls/$pr_number" | jq -r '.head.ref')
- source_branch=${source_branch//\//-}
- echo "[DEBUG] source branch is: $source_branch"
- echo "TAG=PR-$pr_number-$source_branch-${{ env.buildid }}" >> $GITHUB_ENV
- else
- echo "TAG=${{env.BRANCH_NAME}}-${{ env.buildid }}" >> $GITHUB_ENV
- fi
- echo "Version TAG: ${{ env.TAG }}"
-
# backing up manifest in case download fails and hashes must be recalculated
- name: Manifest backup
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
@@ -91,7 +67,7 @@ jobs:
- name: "Build flatpak: download only"
id: "flatpak-download"
- run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh"
+ run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
continue-on-error: true
# Sometimes flatpak download fails, in this case it tries a second time
@@ -103,10 +79,10 @@ jobs:
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
- "${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh"
+ "${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
- name: Build flatpak
- run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only_persistent.sh"
+ run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"
- name: Create Artifact for flathub
run: |
@@ -117,7 +93,7 @@ jobs:
continue-on-error: true
- name: Create Bundle
- run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle_persistent.sh"
+ run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle.sh"
- name: Set environment variable with current branch name
run: echo "GITHUB_REF_SLUG=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
@@ -133,10 +109,23 @@ jobs:
id: commits
continue-on-error: true
+ - name: Get branch name
+ id: branch_name
+ run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV
+
+ # if it's a feature branch it will not marked as "latest" cooker version
+ - name: "Set makeLatest (cooker only)"
+ run: |
+ if [[ "$BRANCH_NAME" == 'feat/'* ]]; then
+ echo "MAKE_LATEST=false" >> $GITHUB_ENV
+ else
+ echo "MAKE_LATEST=true" >> $GITHUB_ENV
+ fi
+
- name: Publish the flatpak in a new cooker release
uses: ncipollo/release-action@v1
with:
- tag: "${{env.TAG}}"
+ tag: "${{env.BRANCH_NAME}}-${{ env.buildid }}"
body: |
# Release Notes (Cooker)
This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
@@ -145,7 +134,7 @@ jobs:
## Commits since last release
${{ steps.commits.outputs.commits }}
- For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/qQcrFvaA2C) on our Discord server.
+ For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server.
Cooker channel is provided for the community to test fixes and explore new functionality.
Please DO NOT open issues or ask support on this build.
@@ -164,3 +153,4 @@ jobs:
name: retrodeck-flatpak
path: RetroDECK-cooker.flatpak
continue-on-error: true
+
diff --git a/.github/workflows/removed/cooker.yml b/old/disabled-workflows/cooker.yml
similarity index 100%
rename from .github/workflows/removed/cooker.yml
rename to old/disabled-workflows/cooker.yml
diff --git a/.github/workflows/removed/flathub_push_cooker.yml b/old/disabled-workflows/flathub_push_cooker.yml
similarity index 100%
rename from .github/workflows/removed/flathub_push_cooker.yml
rename to old/disabled-workflows/flathub_push_cooker.yml
diff --git a/.github/workflows/removed/main.yml b/old/disabled-workflows/main.yml
similarity index 100%
rename from .github/workflows/removed/main.yml
rename to old/disabled-workflows/main.yml
diff --git a/.github/workflows/submodule-update.yml b/old/disabled-workflows/submodule-update.yml
similarity index 100%
rename from .github/workflows/submodule-update.yml
rename to old/disabled-workflows/submodule-update.yml
diff --git a/.github/workflows/removed/update-readthedocs.yml b/old/disabled-workflows/update-readthedocs.yml
similarity index 100%
rename from .github/workflows/removed/update-readthedocs.yml
rename to old/disabled-workflows/update-readthedocs.yml
diff --git a/old/removed-modules.yml b/old/removed-modules.yml
index 43d5cab3..04274441 100644
--- a/old/removed-modules.yml
+++ b/old/removed-modules.yml
@@ -112,24 +112,7 @@
# Duckstation-DontUpdate - END
- # Ryujinx Appimage - START
- # https://ryujinx.org/download
-
- # - name: Ryujinx
- # buildsystem: simple
- # build-commands:
- # - |
- # tar -zxvf ryujinx-1.1.685-linux_x64.tar.gz
- # mv -v publish ${FLATPAK_DEST}/ryujinx
- # ln -sv ${FLATPAK_DEST}/ryujinx/Ryujinx ${FLATPAK_DEST}/bin/Ryujinx
- # sources:
- # - type: file
- # url: https://github.com/Ryujinx/release-channel-master/releases/download/1.1.685/ryujinx-1.1.685-linux_x64.tar.gz
- # sha256: bc4d7076106d7aa59c3a3ea22b83c553e5fa1a897815831adcf18cc13d729e15
-
- # Ryujinx Appimage - END
-
- # Ryujinx - START
+ # Ryujinx - START
# https://github.com/flathub/org.ryujinx.Ryujinx
- name: Ryujinx
diff --git a/other_licenses.txt b/other_licenses.txt
new file mode 100644
index 00000000..1b8073a9
--- /dev/null
+++ b/other_licenses.txt
@@ -0,0 +1,27 @@
+All Licenses of the projects we are using are listed on the wiki:
+https://retrodeck.readthedocs.io/en/latest/wiki_about/donations-licenses/
+
+If we have made some linkage errors or your license needs to be included in the projects github page please contact the RetroDECK Team on Discord or Matrix.
+
+---
+
+Freedoom
+https://github.com/freedoom/freedoom?tab=License-1-ov-file#readme
+
+Copyright © 2001-2024 Contributors to the Freedoom project. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+ Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+ Neither the name of the Freedoom project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+For a list of contributors to the Freedoom project, see the file CREDITS.
+
+---
+
+
diff --git a/rd-submodules/citra/citra-launcher.sh b/rd-submodules/citra/citra-launcher.sh
deleted file mode 100644
index 33b95cfb..00000000
--- a/rd-submodules/citra/citra-launcher.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash -e
-
-report_error() {
- read -r -d '|' MESSAGE <https://github.com/flathub/org.citra_emu.citra/issues.
-
-When submitting a bug report, please attach your system information and the Citra log file .
-You seem to be using ${XDG_SESSION_DESKTOP} ${DESKTOP_SESSION} (${XDG_SESSION_TYPE}):
-To obtain Citra log files, please see this guide .
-To obtain your system information, please install inxi and run inxi -v3 . |
-EOF
- zenity --warning --no-wrap --title "That's awkward ..." --text "$MESSAGE"
-}
-
-unset VK_ICD_FILENAMES VK_DRIVER_FILES
-# Discord RPC
-for i in {0..9}; do
- test -S "$XDG_RUNTIME_DIR"/"discord-ipc-$i" || ln -sf {app/com.discordapp.Discord,"$XDG_RUNTIME_DIR"}/"discord-ipc-$i";
-done
-
-
-if ! prlimit --nofile=8192 citra-qt "$@"; then
- report_error
-fi
\ No newline at end of file
diff --git a/rd-submodules/citra/org.citra_emu.citra.svg b/rd-submodules/citra/org.citra_emu.citra.svg
deleted file mode 100644
index 8fa09944..00000000
--- a/rd-submodules/citra/org.citra_emu.citra.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/rd-submodules/es-de/GuiMenu.cpp.patch b/rd-submodules/es-de/GuiMenu.cpp.patch
deleted file mode 100644
index b0c035ea..00000000
--- a/rd-submodules/es-de/GuiMenu.cpp.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-diff -au1r emulationstation-de/es-app/src/guis/GuiMenu.cpp emulationstation-de/es-app/src/guis/GuiMenu.cpp
---- emulationstation-de/es-app/src/guis/GuiMenu.cpp 2023-08-23 13:12:15.617292576 +0200
-+++ emulationstation-de/es-app/src/guis/GuiMenu.cpp 2023-08-23 13:44:10.736412006 +0200
-@@ -67,2 +67,4 @@
-
-+ addEntry("RETRODECK CONFIGURATOR", mMenuColorPrimary, false, [this] { openRetroDeckConfigurator(); });
-+
- if (!Settings::getInstance()->getBool("ForceKiosk") &&
-@@ -70,3 +72,3 @@
- #if defined(__APPLE__)
-- addEntry("QUIT EMULATIONSTATION", mMenuColorPrimary, false, [this] { openQuitMenu(); });
-+ addEntry("QUIT RETRODECK", mMenuColorPrimary, false, [this] { openQuitMenu(); });
- #else
-@@ -75,3 +77,3 @@
- else
-- addEntry("QUIT EMULATIONSTATION", mMenuColorPrimary, false, [this] { openQuitMenu(); });
-+ addEntry("QUIT RETRODECK", mMenuColorPrimary, false, [this] { openQuitMenu(); });
- #endif
-@@ -1758,3 +1760,3 @@
- auto quitText = std::make_shared(
-- "QUIT EMULATIONSTATION", Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary);
-+ "QUIT RETRODECK", Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary);
- quitText->setSelectable(true);
-@@ -1910 +1912,14 @@
- }
-+
-+void GuiMenu::openRetroDeckConfigurator()
-+{
-+ // Launch the configurator.sh script
-+ std::string command;
-+ std::string startDirectory;
-+ bool runInBackground;
-+ command = "bash /app/tools/configurator.sh";
-+ startDirectory = "/app/tools";
-+ runInBackground = false;
-+ int result = Utils::Platform::launchGameUnix(command, startDirectory, runInBackground);
-+ // You can add any checks for the script's outcome here.
-+}
diff --git a/rd-submodules/es-de/GuiMenu.h.patch b/rd-submodules/es-de/GuiMenu.h.patch
deleted file mode 100644
index 13a6b687..00000000
--- a/rd-submodules/es-de/GuiMenu.h.patch
+++ /dev/null
@@ -1,10 +0,0 @@
-diff -au1r emulationstation-de/es-app/src/guis/GuiMenu.h emulationstation-de/es-app/src/guis/GuiMenu.h
---- emulationstation-de/es-app/src/guis/GuiMenu.h 2023-08-23 13:12:15.617292576 +0200
-+++ emulationstation-de/es-app/src/guis/GuiMenu.h 2023-08-23 13:50:20.978700234 +0200
-@@ -46,2 +46,3 @@
- void openOtherOptions();
-+ void openRetroDeckConfigurator();
- void openQuitMenu();
-@@ -54 +55,2 @@
- #endif // ES_APP_GUIS_GUI_MENU_H
-+
diff --git a/rd-submodules/es-de/GuiThemeDownloader.cpp.patch b/rd-submodules/es-de/GuiThemeDownloader.cpp.patch
deleted file mode 100644
index 8dd35293..00000000
--- a/rd-submodules/es-de/GuiThemeDownloader.cpp.patch
+++ /dev/null
@@ -1,10 +0,0 @@
-diff -au1r emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp
---- emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp 2023-11-03 16:25:01.115126901 +0100
-+++ emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp 2023-11-03 16:26:18.882607724 +0100
-@@ -602,4 +602,4 @@
- getHelpStyle(),
-- "IT SEEMS AS IF YOU'RE NOT RUNNING THE LATEST ES-DE RELEASE, PLEASE UPGRADE BEFORE "
-- "PROCEEDING AS THESE THEMES MAY NOT BE COMPATIBLE WITH YOUR VERSION",
-+ "ES-DE THEME ENGINE WAS UPDATED UPSTREAM. THESE THEMES MAY NOT BE COMPATIBLE WITH THE CURRENT RETRODECK VERSION."
-+ "CHECK IF A NEW RETRODECK UPDATE IS AVAILABLE, ELSE PLEASE WAIT FOR IT OR PROCEED AT YOUR OWN RISK.",
- "OK", [] { return; }, "", nullptr, "", nullptr, nullptr, true));
diff --git a/rd-submodules/es-de/ViewController.cpp.patch b/rd-submodules/es-de/ViewController.cpp.patch
deleted file mode 100644
index 8d677c37..00000000
--- a/rd-submodules/es-de/ViewController.cpp.patch
+++ /dev/null
@@ -1,101 +0,0 @@
-diff -au1r emulationstation-de/es-app/src/views/ViewController.cpp emulationstation-de/es-app/src/views/ViewController.cpp
---- emulationstation-de/es-app/src/views/ViewController.cpp 2023-11-04 15:09:24.332178777 -0400
-+++ emulationstation-de/es-app/src/views/ViewController.cpp 2023-11-04 15:13:59.015780009 -0400
-@@ -195,91 +195,3 @@
- mNoGamesMessageBox = new GuiMsgBox(
-- HelpStyle(), mNoGamesErrorMessage + mRomDirectory, "CHANGE ROM DIRECTORY",
-- [this] {
-- std::string currentROMDirectory;
--#if defined(_WIN64)
-- currentROMDirectory = Utils::String::replace(FileData::getROMDirectory(), "/", "\\");
--#else
-- currentROMDirectory = FileData::getROMDirectory();
--#endif
-- if (Settings::getInstance()->getBool("VirtualKeyboard")) {
-- mWindow->pushGui(new GuiTextEditKeyboardPopup(
-- HelpStyle(), 0.0f, "ENTER ROM DIRECTORY PATH", currentROMDirectory,
-- [this, currentROMDirectory](const std::string& newROMDirectory) {
-- if (currentROMDirectory != newROMDirectory) {
-- Settings::getInstance()->setString(
-- "ROMDirectory", Utils::String::trim(newROMDirectory));
-- Settings::getInstance()->saveFile();
--#if defined(_WIN64)
-- mRomDirectory =
-- Utils::String::replace(FileData::getROMDirectory(), "/", "\\");
--#else
-- mRomDirectory = FileData::getROMDirectory();
--#endif
-- mNoGamesMessageBox->changeText(mNoGamesErrorMessage + mRomDirectory);
-- mWindow->pushGui(new GuiMsgBox(HelpStyle(),
-- "ROM DIRECTORY SETTING SAVED, RESTART\n"
-- "THE APPLICATION TO RESCAN THE SYSTEMS",
-- "OK", nullptr, "", nullptr, "", nullptr,
-- nullptr, true, true));
-- }
-- },
-- false, "SAVE", "SAVE CHANGES?", "Currently configured path:",
-- currentROMDirectory, "LOAD CURRENTLY CONFIGURED PATH",
-- "CLEAR (LEAVE BLANK TO RESET TO DEFAULT PATH)"));
-- }
-- else {
-- mWindow->pushGui(new GuiTextEditPopup(
-- HelpStyle(), "ENTER ROM DIRECTORY PATH", currentROMDirectory,
-- [this](const std::string& newROMDirectory) {
-- Settings::getInstance()->setString("ROMDirectory",
-- Utils::String::trim(newROMDirectory));
-- Settings::getInstance()->saveFile();
--#if defined(_WIN64)
-- mRomDirectory =
-- Utils::String::replace(FileData::getROMDirectory(), "/", "\\");
--#else
-- mRomDirectory = FileData::getROMDirectory();
--#endif
-- mNoGamesMessageBox->changeText(mNoGamesErrorMessage + mRomDirectory);
-- mWindow->pushGui(new GuiMsgBox(HelpStyle(),
-- "ROM DIRECTORY SETTING SAVED, RESTART\n"
-- "THE APPLICATION TO RESCAN THE SYSTEMS",
-- "OK", nullptr, "", nullptr, "", nullptr,
-- nullptr, true));
-- },
-- false, "SAVE", "SAVE CHANGES?", "Currently configured path:",
-- currentROMDirectory, "LOAD CURRENTLY CONFIGURED PATH",
-- "CLEAR (LEAVE BLANK TO RESET TO DEFAULT PATH)"));
-- }
-- },
-- "CREATE DIRECTORIES",
-- [this] {
-- mWindow->pushGui(new GuiMsgBox(
-- HelpStyle(),
-- "THIS WILL CREATE DIRECTORIES FOR ALL THE\n"
-- "GAME SYSTEMS DEFINED IN es_systems.xml\n\n"
-- "THIS MAY CREATE A LOT OF FOLDERS SO IT'S\n"
-- "ADVICED TO REMOVE THE ONES YOU DON'T NEED",
-- "PROCEED",
-- [this] {
-- if (!SystemData::createSystemDirectories()) {
-- mWindow->pushGui(new GuiMsgBox(HelpStyle(),
-- "THE SYSTEM DIRECTORIES WERE SUCCESSFULLY\n"
-- "GENERATED, EXIT THE APPLICATION AND PLACE\n"
-- "YOUR GAMES IN THE NEWLY CREATED FOLDERS",
-- "OK", nullptr, "", nullptr, "", nullptr,
-- nullptr, true));
-- }
-- else {
-- mWindow->pushGui(new GuiMsgBox(HelpStyle(),
-- "ERROR CREATING THE SYSTEM DIRECTORIES,\n"
-- "PERMISSION PROBLEMS OR DISK FULL?\n\n"
-- "SEE THE LOG FILE FOR MORE DETAILS",
-- "OK", nullptr, "", nullptr, "", nullptr,
-- nullptr, true));
-- }
-- },
-- "CANCEL", nullptr, "", nullptr, nullptr, false));
-- },
-- "QUIT",
-+ HelpStyle(), mNoGamesErrorMessage + mRomDirectory, "QUIT",
- [] {
-@@ -289,3 +201,3 @@
- },
-- nullptr, true, false,
-+ "", nullptr, "", nullptr, nullptr, true, true,
- (mRenderer->getIsVerticalOrientation() ?
diff --git a/rd-submodules/es-de/Window.cpp.patch b/rd-submodules/es-de/Window.cpp.patch
deleted file mode 100644
index c099d83b..00000000
--- a/rd-submodules/es-de/Window.cpp.patch
+++ /dev/null
@@ -1,9 +0,0 @@
-diff -au1r emulationstation-de/es-core/src/Window.cpp emulationstation-de/es-core/src/Window.cpp
---- emulationstation-de/es-core/src/Window.cpp 2023-08-29 14:14:17.208301836 +0200
-+++ emulationstation-de/es-core/src/Window.cpp 2023-08-29 14:12:37.307334069 +0200
-
-@@ -181,3 +181,3 @@
- progressBarRect.barPosY += borderThickness;
-- progressBarRect.color = 0x79010FFF;
-+ progressBarRect.color = 0xC858E6FF;
- mProgressBarRectangles.emplace_back(progressBarRect);
diff --git a/rd-submodules/es-de/patch_helper.sh b/rd-submodules/es-de/patch_helper.sh
deleted file mode 100755
index 27923b97..00000000
--- a/rd-submodules/es-de/patch_helper.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-
-mkdir /tmp
-
-branch="00a226062fff37209d98e0ab048ac89af50ecacc"
-git clone "https://gitlab.com/es-de/emulationstation-de.git" /tmp/emulationstation-de
-
-pushd .
-cd /tmp/emulationstation-de
-git checkout $branch
-popd
-
-mkdir patches-tmp
-
-cp /tmp/emulationstation-de/es-app/src/guis/GuiMenu.cpp ./patches-tmp
-cp /tmp/emulationstation-de/es-app/src/guis/GuiMenu.h ./patches-tmp
-cp /tmp/emulationstation-de/es-app/src/views/ViewController.cpp ./patches-tmp
-cp /tmp/emulationstation-de/es-core/src/Window.cpp ./patches-tmp
-cp /tmp/emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp ./patches-tmp
-
-read -p "Please edit the files in \"patches-tmp\" and press enter to continue."
-
-diff -au1r /tmp/emulationstation-de/es-app/src/guis/GuiMenu.cpp ./patches-tmp/GuiMenu.cpp > GuiMenu.cpp.patch
-diff -au1r /tmp/emulationstation-de/es-app/src/guis/GuiMenu.h ./patches-tmp/GuiMenu.h > GuiMenu.h.patch
-diff -au1r /tmp/emulationstation-de/es-app/src/views/ViewController.cpp ./patches-tmp/ViewController.cpp > ViewController.cpp.patch
-diff -au1r /tmp/emulationstation-de/es-core/src/Window.cpp ./patches-tmp/Window.cpp > Window.cpp.patch
-diff -au1r /tmp/emulationstation-de/es-app/src/guis/GuiThemeDownloader.cpp ./patches-tmp/GuiThemeDownloader.cpp > GuiThemeDownloader.cpp.patch
-
-rm -rf patches-tmp
-
-echo "Done, now please remeber to edit the headers of the patch files with the correct paths."
\ No newline at end of file
diff --git a/rd-submodules/retroarch b/rd-submodules/retroarch
index 51d4821a..c2aad986 160000
--- a/rd-submodules/retroarch
+++ b/rd-submodules/retroarch
@@ -1 +1 @@
-Subproject commit 51d4821a45ac5fe13b2baa69aaaea864ead407ce
+Subproject commit c2aad98600a47ab250f1b133328d0ccc1310f65e
diff --git a/rd-submodules/ryujinx b/rd-submodules/ryujinx
index ebcd7d1c..ea1dae93 160000
--- a/rd-submodules/ryujinx
+++ b/rd-submodules/ryujinx
@@ -1 +1 @@
-Subproject commit ebcd7d1c9bbb2d4857555238727a81e89f6600f1
+Subproject commit ea1dae930a6f61388c2b5e05f95bb6ed0120926e
diff --git a/rd-submodules/shared-modules b/rd-submodules/shared-modules
index 6ba63f38..f63cb3f5 160000
--- a/rd-submodules/shared-modules
+++ b/rd-submodules/shared-modules
@@ -1 +1 @@
-Subproject commit 6ba63f383ad54e7ebe2b0cda64c15602cf9a9153
+Subproject commit f63cb3f5fff835c141769d35cd54ce0ae042fcbf
diff --git a/res/binding_icons/RD-alt-f4.png b/res/binding_icons/RD-alt-f4.png
new file mode 100644
index 00000000..ed3924be
Binary files /dev/null and b/res/binding_icons/RD-alt-f4.png differ
diff --git a/res/binding_icons/RD-freedoom-git.png b/res/binding_icons/RD-freedoom-git.png
new file mode 100644
index 00000000..ac56a7d1
Binary files /dev/null and b/res/binding_icons/RD-freedoom-git.png differ
diff --git a/res/binding_icons/RD-freedoom-gud.png b/res/binding_icons/RD-freedoom-gud.png
new file mode 100644
index 00000000..dc84ddfa
Binary files /dev/null and b/res/binding_icons/RD-freedoom-gud.png differ
diff --git a/res/binding_icons/RD-freedoom-lol.png b/res/binding_icons/RD-freedoom-lol.png
new file mode 100644
index 00000000..b486e149
Binary files /dev/null and b/res/binding_icons/RD-freedoom-lol.png differ
diff --git a/res/binding_icons/RD-freedoom-map.png b/res/binding_icons/RD-freedoom-map.png
new file mode 100644
index 00000000..fbb8dcf5
Binary files /dev/null and b/res/binding_icons/RD-freedoom-map.png differ
diff --git a/res/binding_icons/RD-freedoom-pack.png b/res/binding_icons/RD-freedoom-pack.png
new file mode 100644
index 00000000..ef10c6ff
Binary files /dev/null and b/res/binding_icons/RD-freedoom-pack.png differ
diff --git a/res/binding_icons/RD-freedoom-pack2.png b/res/binding_icons/RD-freedoom-pack2.png
new file mode 100644
index 00000000..36d90a78
Binary files /dev/null and b/res/binding_icons/RD-freedoom-pack2.png differ
diff --git a/res/binding_icons/RD-freedoom-pack3.png b/res/binding_icons/RD-freedoom-pack3.png
new file mode 100644
index 00000000..886a94f7
Binary files /dev/null and b/res/binding_icons/RD-freedoom-pack3.png differ
diff --git a/res/binding_icons/RD-tilt-1.png b/res/binding_icons/RD-tilt-1.png
new file mode 100644
index 00000000..5aa9429d
Binary files /dev/null and b/res/binding_icons/RD-tilt-1.png differ
diff --git a/res/binding_icons/RD-tilt-2.png b/res/binding_icons/RD-tilt-2.png
new file mode 100644
index 00000000..c41608bc
Binary files /dev/null and b/res/binding_icons/RD-tilt-2.png differ
diff --git a/res/binding_icons/RD-tilt-3.png b/res/binding_icons/RD-tilt-3.png
new file mode 100644
index 00000000..89ce3d99
Binary files /dev/null and b/res/binding_icons/RD-tilt-3.png differ
diff --git a/res/binding_icons/RD-tilt-4.png b/res/binding_icons/RD-tilt-4.png
new file mode 100644
index 00000000..15b38ec1
Binary files /dev/null and b/res/binding_icons/RD-tilt-4.png differ
diff --git a/res/binding_icons/RD-wii-1.png b/res/binding_icons/RD-wii-1.png
new file mode 100644
index 00000000..0373189c
Binary files /dev/null and b/res/binding_icons/RD-wii-1.png differ
diff --git a/res/binding_icons/RD-wii-2.png b/res/binding_icons/RD-wii-2.png
new file mode 100644
index 00000000..ea772437
Binary files /dev/null and b/res/binding_icons/RD-wii-2.png differ
diff --git a/res/binding_icons/RD-wii-3.png b/res/binding_icons/RD-wii-3.png
new file mode 100644
index 00000000..3cff0e74
Binary files /dev/null and b/res/binding_icons/RD-wii-3.png differ
diff --git a/res/binding_icons/RD-wii-4.png b/res/binding_icons/RD-wii-4.png
new file mode 100644
index 00000000..73feea86
Binary files /dev/null and b/res/binding_icons/RD-wii-4.png differ
diff --git a/res/binding_icons/RD-mote-side.png b/res/binding_icons/RD-wiimote-side.png
similarity index 100%
rename from res/binding_icons/RD-mote-side.png
rename to res/binding_icons/RD-wiimote-side.png
diff --git a/res/binding_icons/RD-mote-up.png b/res/binding_icons/RD-wiimote-up.png
similarity index 100%
rename from res/binding_icons/RD-mote-up.png
rename to res/binding_icons/RD-wiimote-up.png
diff --git a/res/binding_icons/rd-tilt.png b/res/binding_icons/rd-tilt.png
new file mode 100644
index 00000000..c1d7ae27
Binary files /dev/null and b/res/binding_icons/rd-tilt.png differ
diff --git a/res/extra_splashes/rd-gm-bday-splash.svg b/res/extra_splashes/rd-gm-bday-splash.svg
new file mode 100644
index 00000000..ebfdf371
--- /dev/null
+++ b/res/extra_splashes/rd-gm-bday-splash.svg
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/icon-configurator.svg b/res/icon-configurator.svg
new file mode 100644
index 00000000..ee678f64
--- /dev/null
+++ b/res/icon-configurator.svg
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/retrodeck.sh b/retrodeck.sh
index 1758eee8..52cd7697 100644
--- a/retrodeck.sh
+++ b/retrodeck.sh
@@ -18,7 +18,7 @@ Arguments:
--info-msg Print paths and config informations
--configurator Starts the RetroDECK Configurator
--compress-one Compresses target file to a compatible format
- --compress-all Compresses all supported games into compatible format. Available formats are \"chd\", \"zip\", \"rvz\" and \"all\".
+ --compress-all Compresses all supported games into a compatible format. Available formats are \"chd\", \"zip\", \"rvz\" and \"all\".
--reset-component Reset one or more component or emulator configs to the default values
--reset-retrodeck Starts the initial RetroDECK installer (backup your data first!)
@@ -56,9 +56,10 @@ https://retrodeck.net
;;
--reset-component*)
echo "You are about to reset one or more RetroDECK components or emulators."
- echo "Available options are: es-de, retroarch, cemu, citra, dolphin, duckstation, melonds, pcsx3, pico8, ppsspp, primehack, rpcs3, xemu, yuzu, vita3k, mame, gzdoom, boilr, all"
+ echo "Available options are: es-de, retroarch, cemu, dolphin, duckstation, gzdoom, melonds, pcsx3, pico8, ppsspp, primehack, rpcs3, ryujinx, xemu, vita3k, mame, boilr, all"
read -p "Please enter the component you would like to reset: " component
- if [[ "$component" =~ ^(es-de|retroarch|cemu|citra|dolphin|duckstation|mame|melonds|pcsx2|ppsspp|primehack|rpcs3|xemu|yuzu|all)$ ]]; then
+ component=$(echo "$component" | tr '[:upper:]' '[:lower:]')
+ if [[ "$component" =~ ^(es-de|retroarch|cemu|dolphin|duckstation|gzdoom|mame|melonds|pcsx2|ppsspp|primehack|ryujinx|rpcs3|xemu|all)$ ]]; then
read -p "You are about to reset $component to default settings. Enter 'y' to continue, 'n' to stop: " response
if [[ $response == [yY] ]]; then
prepare_component "reset" "$component" "cli"
@@ -79,8 +80,8 @@ https://retrodeck.net
if [[ $response == [yY] ]]; then
rm -f "$lockfile"
rm -f "$rd_conf"
- read -p "The process has been completed, press Enter key to start the initial RetroDECK setup process."
- shift # Continue launch after previous command is finished
+ read -p "The process has been completed, press Enter key to exit. Please run RetroDECK again to start the initial setup process."
+ exit 1
else
read -p "The process has been cancelled, press Enter key to exit."
exit
@@ -99,13 +100,14 @@ https://retrodeck.net
esac
done
-# UPDATE TRIGGERED
+log d "Update triggered"
# if lockfile exists
if [ -f "$lockfile" ]; then
- # ...but the version doesn't match with the config file
if [ "$hard_version" != "$version" ]; then
- echo "Config file's version is $version but the actual version is $hard_version"
+ log d "Lockfile found but the version doesn't match with the config file"
+ log i "Config file's version is $version but the actual version is $hard_version"
if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build
+ log d "Newly-installed version is a \"cooker\" build"
configurator_generic_dialog "RetroDECK Cooker Warning" "RUNNING COOKER VERSIONS OF RETRODECK CAN BE EXTREMELY DANGEROUS AND ALL OF YOUR RETRODECK DATA\n(INCLUDING BIOS FILES, BORDERS, DOWNLOADED MEDIA, GAMELISTS, MODS, ROMS, SAVES, STATES, SCREENSHOTS, TEXTURE PACKS AND THEMES)\nARE AT RISK BY CONTINUING!"
set_setting_value $rd_conf "update_repo" "RetroDECK-cooker" retrodeck "options"
set_setting_value $rd_conf "update_check" "true" retrodeck "options"
@@ -118,7 +120,7 @@ if [ -f "$lockfile" ]; then
rc=$? # Capture return code, as "Yes" button has no text value
if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked
if [[ $choice == "Don't Upgrade" ]]; then # If user wants to bypass the post_update.sh process this time.
- echo "Skipping upgrade process for cooker build, updating stored version in retrodeck.cfg"
+ log i "Skipping upgrade process for cooker build, updating stored version in retrodeck.cfg"
set_setting_value $rd_conf "version" "$hard_version" retrodeck # Set version of currently running RetroDECK to updated retrodeck.cfg
elif [[ $choice == "Full Wipe and Fresh Install" ]]; then # Remove all RetroDECK data and start a fresh install
if [[ $(configurator_generic_question_dialog "RetroDECK Cooker Reset" "This is going to remove all of the data in all locations used by RetroDECK!\n\n(INCLUDING BIOS FILES, BORDERS, DOWNLOADED MEDIA, GAMELISTS, MODS, ROMS, SAVES, STATES, SCREENSHOTS, TEXTURE PACKS AND THEMES)\n\nAre you sure you want to contine?") == "true" ]]; then
@@ -126,9 +128,10 @@ if [ -f "$lockfile" ]; then
if [[ $(configurator_generic_question_dialog "RetroDECK Cooker Reset" "But are you super DUPER sure? We REAAAALLLLLYY want to make sure you know what is happening here.\n\nThe ~/retrodeck and ~/.var/app/net.retrodeck.retrodeck folders and ALL of their contents\nare about to be PERMANENTLY removed.\n\nStill sure you want to proceed?") == "true" ]]; then
configurator_generic_dialog "RetroDECK Cooker Reset" "Ok, if you're that sure, here we go!"
if [[ $(configurator_generic_question_dialog "RetroDECK Cooker Reset" "(Are you actually being serious here? Because we are...\n\nNo backsies.)") == "true" ]]; then
- echo "Removing RetroDECK data and starting fresh"
+ log w "Removing RetroDECK data and starting fresh"
rm -rf /var
rm -rf "$HOME/retrodeck"
+ rm -rf "$rdhome"
source /app/libexec/global.sh
finit
fi
@@ -137,7 +140,7 @@ if [ -f "$lockfile" ]; then
fi
fi
else
- echo "Performing normal upgrade process for version" $cooker_base_version
+ log i "Performing normal upgrade process for version $cooker_base_version"
version=$cooker_base_version # Temporarily assign cooker base version to $version so update script can read it properly.
post_update
fi
@@ -156,7 +159,7 @@ if [ -f "$lockfile" ]; then
# Else, LOCKFILE IS NOT EXISTING (WAS REMOVED)
# if the lock file doesn't exist at all means that it's a fresh install or a triggered reset
else
- echo "Lockfile not found"
+ log w "Lockfile not found"
finit # Executing First/Force init
fi
@@ -165,23 +168,21 @@ if [[ $multi_user_mode == "true" ]]; then
fi
# Run optional startup checks
-
-desktop_mode_warning
+if [[ $(check_is_steam_deck) == "true" ]]; then # Only warn about Desktop Mode on Steam Deck, ignore for other platforms
+ desktop_mode_warning
+fi
low_space_warning
# Check if there is a new version of RetroDECK available, if update_check=true in retrodeck.cfg and there is network connectivity available.
+log i "Check if there is a new version of RetroDECK available"
if [[ $update_check == "true" ]]; then
if [[ $(check_network_connectivity) == "true" ]]; then
+ log d "Running function check_for_version_update"
check_for_version_update
fi
+ log i "You're running the latest version"
fi
-# THIS IS A ONE-OFF FORCED REFRESH OF RETRODECK CONTROLLER PROFILES IN A 0.7.6b VERSION REFRESH - REMOVE BEFORE NEXT VERSION RELEASE
-if [[ -f "$HOME/.steam/steam/controller_base/templates/RetroDECK_controller_config.vdf" ]]; then # If RetroDECK controller profile has been previously installed
- install_retrodeck_controller_profile
-fi
-# REMOVE BEFORE NEXT VERSION RELEASE
-
# Normal Startup
if [[ $steam_sync == "true" ]]; then
diff --git a/tools/configurator.sh b/tools/configurator.sh
index 88918020..5749dcf5 100644
--- a/tools/configurator.sh
+++ b/tools/configurator.sh
@@ -13,13 +13,14 @@ source /app/libexec/global.sh
# - Global: Presets & Settings
# - Widescreen: Enable/Disable
# - Ask-To-Exit: Enable/Disable
+# - Quick Resume: Enable/Disable
# - RetroAchievements: Login
# - RetroAchievements: Logout
# - RetroAchievements: Hardcore Mode
-# - Swap A/B and X/Y Buttons
+# - Rewind: Enable/Disable
+# - Swap A/B and X/Y Buttons: Enable/Disable
# - RetroArch: Presets & Settings
# - Borders: Enable/Disable
-# - Rewind: Enable/Disable
# - Wii & GameCube: Presets & Settings
# - Dolphin Textures: Universal Dynamic Input
# - Primehack Textures: Universal Dynamic Input
@@ -58,15 +59,17 @@ source /app/libexec/global.sh
# - Compress Multiple Games - RVZ
# - Compress Multiple Games - All Formats
# - Compress All Games
-# - Install: RetroDECK SD Controller Profile
+# - Install: RetroDECK Controller Layouts
# - Install: PS3 firmware
+# - Install: PS Vita firmware
# - RetroDECK: Change Update Setting
# - Troubleshooting
# - Backup: RetroDECK Userdata
# - Check & Verify: BIOS
+# - Check & Verify: BIOS - Expert Mode
# - Check & Verify: Multi-file structure
# - RetroDECK: Reset
-# - Reset Specific Emulator
+# - Reset Emulator or Engine
# - Reset RetroArch
# - Reset Cemu
# - Reset Citra
@@ -104,13 +107,14 @@ source /app/libexec/global.sh
# DIALOG TREE FUNCTIONS
configurator_welcome_dialog() {
+ log i "Configurator: opening welcome dialog"
if [[ $developer_options == "true" ]]; then
- welcome_menu_options=("Presets & Settings" "Here you find various presets, tweaks and settings to customize your RetroDECK experience" \
- "Open Emulator" "Launch and configure each emulators settings (for advanced users)" \
+ welcome_menu_options=("Presets & Settings" "Here you will find various presets, tweaks and settings to customize your RetroDECK experience" \
+ "Open Emulator" "Launch and configure each emulator's settings (for advanced users)" \
"RetroDECK: Tools" "Compress games, move RetroDECK and install optional features" \
- "RetroDECK: Troubleshooting" "Backup data, perform BIOS / multi-disc file checks checks and emulator resets" \
+ "RetroDECK: Troubleshooting" "Backup data, perform BIOS / multi-disc file checks and emulator resets" \
"RetroDECK: About" "Show additional information about RetroDECK" \
- "Sync with Steam" "Sync with Steam all the favorites games" \
+ "Sync with Steam" "Sync all favorited games with Steam" \
"ROM Hack Downloader" "Install ROM Hacks which are compatible with your ROMs" \
"Developer Options" "Welcome to the DANGER ZONE")
else
@@ -118,8 +122,7 @@ configurator_welcome_dialog() {
"Open Emulator" "Launch and configure each emulators settings (for advanced users)" \
"RetroDECK: Tools" "Compress games, move RetroDECK and install optional features" \
"RetroDECK: Troubleshooting" "Backup data, perform BIOS / multi-disc file checks checks and emulator resets" \
- "RetroDECK: About" "Show additional information about RetroDECK" \
- "Sync with Steam" "Sync with Steam all the favorites games")
+ "RetroDECK: About" "Show additional information about RetroDECK")
fi
choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" \
@@ -130,26 +133,32 @@ configurator_welcome_dialog() {
case $choice in
"Presets & Settings" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_presets_and_settings_dialog
;;
"Open Emulator" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_power_user_warning_dialog
;;
"RetroDECK: Tools" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_retrodeck_tools_dialog
;;
"RetroDECK: Troubleshooting" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_retrodeck_troubleshooting_dialog
;;
"RetroDECK: About" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_about_retrodeck_dialog
;;
"Sync with Steam" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_add_steam
;;
@@ -159,11 +168,13 @@ configurator_welcome_dialog() {
;;
"Developer Options" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_generic_dialog "RetroDECK Configurator - Developer Options" "The following features and options are potentially VERY DANGEROUS for your RetroDECK install!\n\nThey should be considered the bleeding-edge of upcoming RetroDECK features, and never used when you have important saves/states/roms that are not backed up!\n\nYOU HAVE BEEN WARNED!"
configurator_developer_dialog
;;
"" )
+ log i "Configurator: closing"
exit 1
;;
@@ -181,18 +192,22 @@ configurator_presets_and_settings_dialog() {
case $choice in
"Global: Presets & Settings" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_global_presets_and_settings_dialog
;;
"RetroArch: Presets & Settings" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_retroarch_presets_and_settings_dialog
;;
"Wii & GameCube: Presets & Settings" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_wii_and_gamecube_presets_and_settings_dialog
;;
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_welcome_dialog
;;
@@ -204,24 +219,33 @@ configurator_global_presets_and_settings_dialog() {
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
--column="Choice" --column="Action" \
"Widescreen: Enable/Disable" "Enable or disable widescreen in supported systems" \
- "Ask-to-Exit: Enable/Disable" "Enable or disable emulators confirming when quitting in supported systems" \
+ "Ask-to-Exit: Enable/Disable" "Enable or disable emulators confirming attempts to quit in supported systems" \
+ "Quick Resume: Enable/Disable" "Enable or disable save state auto-save/load in supported systems" \
"RetroAchievements: Login" "Log into the RetroAchievements service in supported systems" \
"RetroAchievements: Logout" "Disable RetroAchievements service in ALL supported systems" \
- "RetroAchievements: Hardcore Mode" "Enable RetroAchievements hardcore mode (no cheats, rewind, save states etc.) in supported emulators" \
- "Swap A/B and X/Y Buttons" "Enable or disable a swapped A/B and X/Y button layout in supported systems" )
+ "RetroAchievements: Hardcore Mode" "Enable RetroAchievements hardcore mode (no cheats, rewind, save states etc.) in supported systems" \
+ "Rewind: Enable/Disable" "Enable or disable the rewind function in supported systems" \
+ "Swap A/B and X/Y Buttons: Enable/Disable" "Enable or disable a swapped A/B and X/Y button layout in supported systems" )
case $choice in
"Widescreen: Enable/Disable" )
+ log i "Configurator: opening \"$choice\" menu"
change_preset_dialog "widescreen"
configurator_global_presets_and_settings_dialog
;;
"Ask-to-Exit: Enable/Disable" )
+ log i "Configurator: opening \"$choice\" menu"
change_preset_dialog "ask_to_exit"
configurator_global_presets_and_settings_dialog
;;
+ "Quick Resume: Enable/Disable" )
+ change_preset_dialog "quick_resume"
+ configurator_global_presets_and_settings_dialog
+ ;;
+
"RetroAchievements: Login" )
local cheevos_creds=$(get_cheevos_token_dialog)
if [[ ! "$cheevos_creds" == "failed" ]]; then
@@ -246,16 +270,27 @@ configurator_global_presets_and_settings_dialog() {
;;
"RetroAchievements: Hardcore Mode" )
+ log i "Configurator: opening \"$choice\" menu"
change_preset_dialog "cheevos_hardcore"
configurator_global_presets_and_settings_dialog
;;
- "Swap A/B and X/Y Buttons" )
+ "Rewind: Enable/Disable" )
+ log i "Configurator: opening \"$choice\" menu"
+
+ change_preset_dialog "rewind"
+ configurator_global_presets_and_settings_dialog
+ ;;
+
+ "Swap A/B and X/Y Buttons: Enable/Disable" )
+ log i "Configurator: opening \"$choice\" menu"
+
change_preset_dialog "abxy_button_swap"
configurator_global_presets_and_settings_dialog
;;
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_presets_and_settings_dialog
;;
@@ -266,57 +301,24 @@ configurator_retroarch_presets_and_settings_dialog() {
choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch: Presets & Settings" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
--column="Choice" --column="Action" \
- "Borders: Enable/Disable" "Enable or disable borders in supported systems" \
- "Rewind: Enable/Disable" "Enable or disable the Rewind function in RetroArch." )
+ "Borders: Enable/Disable" "Enable or disable borders in supported systems" )
case $choice in
"Borders: Enable/Disable" )
+ log i "Configurator: opening \"$choice\" menu"
change_preset_dialog "borders"
configurator_retroarch_presets_and_settings_dialog
;;
- "Rewind: Enable/Disable" )
- configurator_retroarch_rewind_dialog
- ;;
-
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_presets_and_settings_dialog
;;
esac
}
-configurator_retroarch_rewind_dialog() {
- if [[ $(get_setting_value "$raconf" rewind_enable retroarch) == "true" ]]; then
- zenity --question \
- --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
- --title "RetroDECK Configurator - RetroArch Rewind" \
- --text="Rewind is currently enabled. Do you want to disable it?."
-
- if [ $? == 0 ]
- then
- set_setting_value "$raconf" "rewind_enable" "false" retroarch
- configurator_process_complete_dialog "disabling Rewind"
- else
- configurator_retroarch_presets_and_settings_dialog
- fi
- else
- zenity --question \
- --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
- --title "RetroDECK Configurator - RetroArch Rewind" \
- --text="Rewind is currently disabled, do you want to enable it?\n\nNOTE:\nThis may impact performance on some more demanding systems."
-
- if [ $? == 0 ]
- then
- set_setting_value "$raconf" "rewind_enable" "true" retroarch
- configurator_process_complete_dialog "enabling Rewind"
- else
- configurator_retroarch_presets_and_settings_dialog
- fi
- fi
-}
-
configurator_wii_and_gamecube_presets_and_settings_dialog() {
choice=$(zenity --list --title="RetroDECK Configurator Utility - Wii & GameCube: Presets & Settings" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
@@ -327,14 +329,17 @@ configurator_wii_and_gamecube_presets_and_settings_dialog() {
case $choice in
"Dolphin Textures: Universal Dynamic Input" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_dolphin_input_textures_dialog
;;
"Primehack Textures: Universal Dynamic Input" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_primehack_input_textures_dialog
;;
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_presets_and_settings_dialog
;;
@@ -346,7 +351,7 @@ configurator_dolphin_input_textures_dialog() {
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - Dolphin Textures: Universal Dynamic Input" \
- --text="Custom input textures are currently enabled. Do you want to disable them?."
+ --text="Custom input textures are currently enabled. Do you want to disable them?"
if [ $? == 0 ]
then
@@ -360,7 +365,7 @@ configurator_dolphin_input_textures_dialog() {
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - Dolphin Textures: Universal Dynamic Input" \
- --text="Custom input textures are currently disabled. Do you want to enable them?.\n\nThis process may take several minutes to complete."
+ --text="Custom input textures are currently disabled. Do you want to enable them?\n\nThis process may take several minutes to complete."
if [ $? == 0 ]
then
@@ -384,7 +389,7 @@ configurator_primehack_input_textures_dialog() {
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - Dolphin Custom Input Textures" \
- --text="Custom input textures are currently enabled. Do you want to disable them?."
+ --text="Custom input textures are currently enabled. Do you want to disable them?"
if [ $? == 0 ]
then
@@ -398,7 +403,7 @@ configurator_primehack_input_textures_dialog() {
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - Primehack Custom Input Textures" \
- --text="Custom input textures are currently disabled. Do you want to enable them?.\n\nThis process may take several minutes to complete."
+ --text="Custom input textures are currently disabled. Do you want to enable them?\n\nThis process may take several minutes to complete."
if [ $? == 0 ]
then
@@ -422,7 +427,7 @@ configurator_power_user_warning_dialog() {
choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="Yes" --extra-button="No" --extra-button="Never show this again" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Power User Warning" \
- --text="Making manual changes to an emulators configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates or when using presets.\n\nSome standalone emulator functions may not work properly outside of Desktop mode.\n\nPlease continue only if you know what you're doing.\n\nDo you want to continue?")
+ --text="Making manual changes to an emulator's configuration may create serious issues,\nand some settings may be overwitten during RetroDECK updates or when using presets.\n\nSome standalone emulator functions may not work properly outside of Desktop mode.\n\nPlease continue only if you know what you're doing.\n\nDo you want to continue?")
fi
rc=$? # Capture return code, as "Yes" button has no text value
if [[ $rc == "0" ]]; then # If user clicked "Yes"
@@ -438,91 +443,118 @@ configurator_power_user_warning_dialog() {
}
configurator_open_emulator_dialog() {
+
+ local emulator_list=(
+ "RetroArch" "Open the multi-emulator frontend RetroArch"
+ "Cemu" "Open the Wii U emulator CEMU"
+ "Dolphin" "Open the Wii & GC emulator Dolphin"
+ "Duckstation" "Open the PSX emulator Duckstation"
+ "MAME" "Open the Multiple Arcade Machine Emulator emulator MAME"
+ "MelonDS" "Open the NDS emulator MelonDS"
+ "PCSX2" "Open the PS2 emulator PSXC2"
+ "PPSSPP" "Open the PSP emulator PPSSPP"
+ "Primehack" "Open the Metroid Prime emulator Primehack"
+ "RPCS3" "Open the PS3 emulator RPCS3"
+ "Ryujinx" "Open the Switch emulator Ryujinx"
+ "Vita3K" "Open the PSVita emulator Vita3K"
+ "XEMU" "Open the Xbox emulator XEMU"
+ )
+
+ # Check if any ponzu is true before adding Yuzu or Citra to the list
+ if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then
+ emulator_list+=("Yuzu" "Open the Switch emulator Yuzu")
+ fi
+ if [[ $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" ]]; then
+ emulator_list+=("Citra" "Open the 3DS emulator Citra")
+ fi
+
emulator=$(zenity --list \
--title "RetroDECK Configurator Utility - Open Emulator" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
--text="Which emulator do you want to launch?" \
--hide-header \
--column="Emulator" --column="Action" \
- "RetroArch" "Open the multi-emulator frontend RetroArch" \
- "Cemu" "Open the Wii U emulator CEMU" \
- "Citra" "Open the N3DS emulator Citra" \
- "Dolphin" "Open the Wii & GC emulator Dolphin" \
- "Duckstation" "Open the PSX emulator Duckstation" \
- "MAME" "Open the Multiple Arcade Machine Emulator emulator MAME" \
- "MelonDS" "Open the NDS emulator MelonDS" \
- "PCSX2" "Open the PS2 emulator PSXC2" \
- "PPSSPP" "Open the PSP emulator PPSSPP" \
- "Primehack" "Open the Metroid Prime emulator Primehack" \
- "RPCS3" "Open the PS3 emulator RPCS3" \
- "Ryujinx" "Open the Switch emulator Ryujinx" \
- "Vita3K" "Open the PSVita emulator Vita3K" \
- "XEMU" "Open the Xbox emulator XEMU" \
- "Yuzu" "Open the Switch emulator Yuzu")
+ "${emulator_list[@]}")
case $emulator in
"RetroArch" )
+ log i "Configurator: \"$emulator\""
retroarch
;;
"Cemu" )
+ log i "Configurator: \"$emulator\""
Cemu-wrapper
;;
"Citra" )
- citra-qt
+ log i "Configurator: \"$emulator\""
+ /var/data/ponzu/Citra/bin/citra-qt
;;
"Dolphin" )
+ log i "Configurator: \"$emulator\""
dolphin-emu
;;
"Duckstation" )
+ log i "Configurator: \"$emulator\""
duckstation-qt
;;
"MAME" )
- mame
+ log i "Configurator: \"$emulator\""
+ mame -inipath /var/config/mame/ini
;;
"MelonDS" )
+ log i "Configurator: \"$emulator\""
melonDS
;;
"PCSX2" )
+ log i "Configurator: \"$emulator\""
pcsx2-qt
;;
"PPSSPP" )
+ log i "Configurator: \"$emulator\""
PPSSPPSDL
;;
"Primehack" )
+ log i "Configurator: \"$emulator\""
primehack-wrapper
;;
"RPCS3" )
+ log i "Configurator: \"$emulator\""
rpcs3
;;
"Ryujinx" )
- ryujinx-wrapper
+ log i "Configurator: \"$emulator\""
+ Ryujinx.sh
;;
"Vita3K" )
+ log i "Configurator: \"$emulator\""
Vita3K
;;
"XEMU" )
+ log i "Configurator: \"$emulator\""
xemu
;;
"Yuzu" )
- yuzu
+ log i "Configurator: \"$emulator\""
+ /var/data/ponzu/Yuzu/bin/yuzu
;;
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_welcome_dialog
;;
@@ -532,27 +564,43 @@ configurator_open_emulator_dialog() {
}
configurator_retrodeck_tools_dialog() {
+
+ local choices=(
+ "Tool: Move Folders" "Move RetroDECK folders between internal/SD card or to a custom location"
+ "Tool: Compress Games" "Compress games for systems that support it"
+ "Install: RetroDECK Controller Layouts" "Install the custom RetroDECK controller layouts on Steam"
+ "Install: PS3 Firmware" "Download and install PS3 firmware for use with the RPCS3 emulator"
+ "Install: PS Vita Firmware" "Download and install PS Vita firmware for use with the Vita3K emulator"
+ "RetroDECK: Change Update Setting" "Enable or disable online checks for new versions of RetroDECK"
+ )
+
+ if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then
+ choices+=("Ponzu - Remove Yuzu" "Run Ponzu to remove Yuzu from RetroDECK. Configurations and saves will be mantained.")
+ fi
+ if [[ $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" ]]; then
+ choices+=("Ponzu - Remove Citra" "Run Ponzu to remove Citra from RetroDECK. Configurations and saves will be mantained.")
+ fi
+
choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroDECK: Tools" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
--column="Choice" --column="Action" \
- "Tool: Move Folders" "Move RetroDECK folders between internal/SD card or to a custom location" \
- "Tool: Compress Games" "Compress games for systems that support it" \
- "Install: RetroDECK SD Controller Profile" "Install the custom RetroDECK controller layout for the Steam Deck" \
- "Install: PS3 Firmware" "Download and install PS3 firmware for use with the RPCS3 emulator" \
- "RetroDECK: Change Update Setting" "Enable or disable online checks for new versions of RetroDECK" )
+ "${choices[@]}")
case $choice in
"Tool: Move Folders" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_retrodeck_move_tool_dialog
;;
"Tool: Compress Games" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_generic_dialog "RetroDECK Configurator - Compression Tool" "Depending on your library and compression choices, the process can sometimes take a long time.\nPlease be patient once it is started!"
configurator_compression_tool_dialog
;;
- "Install: RetroDECK SD Controller Profile" )
+ "Install: RetroDECK Controller Layouts" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_generic_dialog "RetroDECK Configurator - Install: RetroDECK Controller Profile" "We are now offering a new official RetroDECK controller profile!\nIt is an optional component that helps you get the most out of RetroDECK with a new in-game radial menu for unified hotkeys across emulators.\n\nThe files need to be installed outside of the normal ~/retrodeck folder, so we wanted your permission before proceeding.\n\nThe files will be installed at the following shared Steam locations:\n\n$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/\n$HOME/.steam/steam/controller_base/templates"
if [[ $(configurator_generic_question_dialog "Install: RetroDECK Controller Profile" "Would you like to install the official RetroDECK controller profile?") == "true" ]]; then
install_retrodeck_controller_profile
@@ -562,28 +610,58 @@ configurator_retrodeck_tools_dialog() {
;;
"Install: PS3 Firmware" )
+ log i "Configurator: opening \"$choice\" menu"
if [[ $(check_network_connectivity) == "true" ]]; then
configurator_generic_dialog "RetroDECK Configurator - Install: PS3 firmware" "This tool will download firmware required by RPCS3 to emulate PS3 games.\n\nThe process will take several minutes, and the emulator will launch to finish the installation.\nPlease close RPCS3 manually once the installation is complete."
(
update_rpcs3_firmware
) |
- zenity --progress --pulsate \
+ zenity --progress --no-cancel --pulsate --auto-close \
--icon-name=net.retrodeck.retrodeck \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title="Downloading PS3 Firmware" \
- --no-cancel \
- --auto-close
+ --width=400 --height=200 \
+ --text="Dowloading and installing PS3 Firmware, please be patient.\n\nNOTICE - If the process is taking too long: \n\nSome windows might be running in the background that could require your attention: pop-ups from emulators or the upgrade itself that needs user input to continue.\n\n"
+
else
configurator_generic_dialog "RetroDECK Configurator - Install: PS3 Firmware" "You do not appear to currently have Internet access, which is required by this tool. Please try again when network access has been restored."
configurator_retrodeck_tools_dialog
fi
;;
+ "Install: PS Vita Firmware" )
+ if [[ $(check_network_connectivity) == "true" ]]; then
+ configurator_generic_dialog "RetroDECK Configurator - Install: PS Vita firmware" "This tool will download firmware required by Vita3K to emulate PS Vita games.\n\nThe process will take several minutes, and the emulator will launch to finish the installation.\nPlease close Vita3K manually once the installation is complete."
+ (
+ update_vita3k_firmware
+ ) |
+ zenity --progress --pulsate \
+ --icon-name=net.retrodeck.retrodeck \
+ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
+ --title="Downloading PS Vita Firmware" \
+ --no-cancel \
+ --auto-close
+ else
+ configurator_generic_dialog "RetroDECK Configurator - Install: PS Vita Firmware" "You do not appear to currently have Internet access, which is required by this tool. Please try again when network access has been restored."
+ configurator_retrodeck_tools_dialog
+ fi
+ ;;
+
"RetroDECK: Change Update Setting" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_online_update_setting_dialog
;;
+"Ponzu - Remove Yuzu" )
+ ponzu_remove "yuzu"
+;;
+
+"Ponzu - Remove Citra" )
+ ponzu_remove "citra"
+;;
+
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_welcome_dialog
;;
@@ -608,42 +686,52 @@ configurator_retrodeck_move_tool_dialog() {
case $choice in
"Move all of RetroDECK" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "rdhome"
;;
"Move ROMs folder" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "roms_folder"
;;
"Move BIOS folder" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "bios_folder"
;;
"Move Downloaded Media folder" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "media_folder"
;;
"Move Saves folder" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "saves_folder"
;;
"Move States folder" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "states_folder"
;;
"Move Themes folder" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "themes_folder"
;;
"Move Screenshots folder" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "screenshots_folder"
;;
"Move Mods folder" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "mods_folder"
;;
"Move Texture Packs folder" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_move_folder_dialog "texture_packs_folder"
;;
@@ -666,30 +754,37 @@ configurator_compression_tool_dialog() {
case $choice in
"Compress Single Game" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_compress_single_game_dialog
;;
"Compress Multiple Games - CHD" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_compress_multiple_games_dialog "chd"
;;
"Compress Multiple Games - ZIP" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_compress_multiple_games_dialog "zip"
;;
"Compress Multiple Games - RVZ" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_compress_multiple_games_dialog "rvz"
;;
"Compress Multiple Games - All Formats" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_compress_multiple_games_dialog "all"
;;
"Compress All Games" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_compress_multiple_games_dialog "everything"
;;
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_retrodeck_tools_dialog
;;
@@ -699,44 +794,45 @@ configurator_compression_tool_dialog() {
configurator_compress_single_game_dialog() {
local file=$(file_browse "Game to compress")
if [[ ! -z "$file" ]]; then
+ local system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$")
local compatible_compression_format=$(find_compatible_compression_format "$file")
if [[ ! $compatible_compression_format == "none" ]]; then
local post_compression_cleanup=$(configurator_compression_cleanup_dialog)
(
- if [[ $compatible_compression_format == "chd" ]]; then
- if [[ $(validate_for_chd "$file") == "true" ]]; then
- echo "# Compressing $(basename "$file") to $compatible_compression_format format"
- compress_game "chd" "$file"
- if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested
- if [[ "$file" == *".cue" ]]; then
- local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file")
- local file_path=$(dirname "$(realpath "$file")")
- while IFS= read -r line
- do
- rm -f "$file_path/$line"
- done < <(printf '%s\n' "$cue_bin_files")
- rm -f "$file"
- else
- rm -f "$file"
- fi
+ echo "# Compressing $(basename "$file") to $compatible_compression_format format" # This updates the Zenity dialog
+ log i "Compressing $(basename "$file") to $compatible_compression_format format"
+ compress_game "$compatible_compression_format" "$file" "$system"
+ if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested
+ if [[ -f "${file%.*}.$compatible_compression_format" ]]; then
+ log i "Performing post-compression file cleanup"
+ if [[ "$file" == *".cue" ]]; then
+ local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file")
+ local file_path=$(dirname "$(realpath "$file")")
+ while IFS= read -r line
+ do
+ log i "Removing file $file_path/$line"
+ rm -f "$file_path/$line"
+ done < <(printf '%s\n' "$cue_bin_files")
+ log i "Removing file $(realpath $file)"
+ rm -f $(realpath "$file")
+ else
+ log i "Removing file $(realpath $file)"
+ rm -f "$(realpath "$file")"
fi
- fi
- else
- echo "# Compressing $(basename "$file") to $compatible_compression_format format"
- compress_game "$compatible_compression_format" "$file"
- if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested
- rm -f "$file"
+ else
+ log i "Compressed file ${file%.*}.$compatible_compression_format not found, skipping original file deletion"
+ configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "A compressed version of the file was not found, skipping deletion."
fi
fi
) |
zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator Utility - Compression in Progress"
- configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The compression process is complete!"
+ configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The compression process is complete."
configurator_compression_tool_dialog
else
- configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The selected file does not have any compatible compressed format."
+ configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The selected file does not have any compatible compression formats."
configurator_compression_tool_dialog
fi
else
@@ -825,23 +921,34 @@ configurator_compress_multiple_games_dialog() {
local post_compression_cleanup=$(configurator_compression_cleanup_dialog)
(
for file in "${games_to_compress[@]}"; do
+ local system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$")
local compression_format=$(find_compatible_compression_format "$file")
echo "# Compressing $(basename "$file") into $compression_format format" # Update Zenity dialog text
+ log i "Compressing $(basename "$file") into $compression_format format"
progress=$(( 100 - (( 100 / "$total_games_to_compress" ) * "$games_left_to_compress" )))
echo $progress
games_left_to_compress=$((games_left_to_compress-1))
- compress_game "$compression_format" "$file"
+ log i "Games left to compress: $games_left_to_compress"
+ compress_game "$compression_format" "$file" "$system"
if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested
- if [[ "$file" == *".cue" ]]; then
- local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file")
- local file_path=$(dirname "$(realpath "$file")")
- while IFS= read -r line
- do
- rm -f "$file_path/$line"
- done < <(printf '%s\n' "$cue_bin_files")
- rm -f $(realpath "$file")
+ if [[ -f "${file%.*}.$compatible_compression_format" ]]; then
+ if [[ "$file" == *".cue" ]]; then
+ local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file")
+ local file_path=$(dirname "$(realpath "$file")")
+ while IFS= read -r line
+ do
+ log i "Removing file $file_path/$line"
+ rm -f "$file_path/$line"
+ done < <(printf '%s\n' "$cue_bin_files")
+ log i "Removing file $(realpath $file)"
+ rm -f $(realpath "$file")
+ else
+ log i "Removing file $(realpath $file)"
+ rm -f "$(realpath "$file")"
+ fi
else
- rm -f "$(realpath "$file")"
+ log i "Compressed file ${file%.*}.$compatible_compression_format not found, skipping original file deletion"
+ configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "Compression of $(basename $file) failed, skipping deletion."
fi
fi
done
@@ -860,7 +967,7 @@ configurator_compression_cleanup_dialog() {
zenity --icon-name=net.retrodeck.retrodeck --question --no-wrap --cancel-label="No" --ok-label="Yes" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK: Compression Tool" \
- --text="Do you want to remove old files after they are compressed?\n\nClicking \"No\" will leave all files behind which will need to be cleaned up manually and may result in game duplicates showing in the RetroDECK library."
+ --text="Do you want to remove old files after they are compressed?\n\nClicking \"No\" will leave all files behind which will need to be cleaned up manually and may result in game duplicates showing in the RetroDECK library.\n\nPlease make sure you have a backup of your ROMs before using automatic cleanup!"
local rc=$? # Capture return code, as "Yes" button has no text value
if [[ $rc == "0" ]]; then # If user clicked "Yes"
echo "true"
@@ -903,12 +1010,14 @@ configurator_retrodeck_troubleshooting_dialog() {
--column="Choice" --column="Action" \
"Backup: RetroDECK Userdata" "Compress and backup important RetroDECK user data folders" \
"Check & Verify: BIOS Files" "Show information about common BIOS files" \
+ "Check & Verify: BIOS Files - Expert Mode" "Show information about common BIOS files, with additional information useful for troubleshooting" \
"Check & Verify: Multi-file structure" "Verify the proper structure of multi-file or multi-disc games" \
"RetroDECK: Reset" "Reset specific parts or all of RetroDECK" )
case $choice in
"Backup: RetroDECK Userdata" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_generic_dialog "RetroDECK Configurator - Backup: RetroDECK Userdata" "This tool will compress important RetroDECK userdata (basically everything except the ROMs folder) into a zip file.\n\nThis process can take several minutes, and the resulting zip file can be found in the ~/retrodeck/backups folder."
(
backup_retrodeck_userdata
@@ -926,18 +1035,26 @@ configurator_retrodeck_troubleshooting_dialog() {
;;
"Check & Verify: BIOS Files" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_check_bios_files
;;
+ "Check & Verify: BIOS Files - Expert Mode" )
+ configurator_check_bios_files_expert_mode
+ ;;
+
"Check & Verify: Multi-file structure" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_check_multifile_game_structure
;;
"RetroDECK: Reset" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_reset_dialog
;;
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_welcome_dialog
;;
@@ -945,10 +1062,10 @@ configurator_retrodeck_troubleshooting_dialog() {
}
configurator_check_bios_files() {
- configurator_generic_dialog "RetroDECK Configurator - Check & Verify: BIOS Files" "This check will look for BIOS files that RetroDECK has identified as working.\n\nNot all BIOS files are required for games to work, please check the BIOS description for more information on its purpose.\n\nThere may be additional BIOS files that will function with the emulators that are not checked.\n\nSome more advanced emulators such as Yuzu will have additional methods for verifiying the BIOS files are in working order."
+ configurator_generic_dialog "RetroDECK Configurator - Check & Verify: BIOS Files" "This check will look for BIOS files that RetroDECK has identified as working.\n\nNot all BIOS files are required for games to work, please check the BIOS description for more information on its purpose.\n\nBIOS files not known to this tool could still function.\n\nSome more advanced emulators such as Ryujinx will have additional methods to verify that the BIOS files are in working order."
bios_checked_list=()
- check_bios_files
+ check_bios_files "basic"
zenity --list --title="RetroDECK Configurator Utility - Check & Verify: BIOS Files" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
@@ -962,6 +1079,26 @@ configurator_check_bios_files() {
configurator_retrodeck_troubleshooting_dialog
}
+configurator_check_bios_files_expert_mode() {
+ configurator_generic_dialog "RetroDECK Configurator - Check & Verify: BIOS Files - Expert Mode" "This check will look for BIOS files that RetroDECK has identified as working.\n\nNot all BIOS files are required for games to work, please check the BIOS description for more information on its purpose.\n\nBIOS files not known to this tool could still function.\n\nSome more advanced emulators such as Ryujinx will have additional methods to verify that the BIOS files are in working order."
+ bios_checked_list=()
+
+ check_bios_files "expert"
+
+ zenity --list --title="RetroDECK Configurator Utility - Check & Verify: BIOS Files" --cancel-label="Back" \
+ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
+ --column "BIOS File Name" \
+ --column "System" \
+ --column "BIOS File Found" \
+ --column "BIOS Hash Match" \
+ --column "BIOS File Description" \
+ --column "BIOS File Subdirectory" \
+ --column "BIOS File Hash" \
+ "${bios_checked_list[@]}"
+
+ configurator_retrodeck_troubleshooting_dialog
+}
+
configurator_check_multifile_game_structure() {
local folder_games=($(find $roms_folder -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3"))
if [[ ${#folder_games[@]} -gt 1 ]]; then
@@ -977,39 +1114,54 @@ configurator_check_multifile_game_structure() {
}
configurator_reset_dialog() {
+
+ local choices=(
+ "Reset Emulator or Engine" "Reset only one specific emulator or engine to default settings"
+ "Reset RetroDECK Component" "Reset a single component, components are parts of RetroDECK that are not emulators"
+ "Reset All Emulators and Components" "Reset all emulators and components to default settings"
+ "Reset RetroDECK" "Reset RetroDECK to default settings"
+ )
+
choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroDECK: Reset" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
--column="Choice" --column="Action" \
- "Reset Specific Emulator" "Reset only one specific emulator or engine to default settings" \
- "Reset RetroDECK Component" "Reset a single component, components are parts of RetroDECK that are not emulators" \
- "Reset All Emulators and Components" "Reset all emulators and components to default settings" \
- "Reset RetroDECK" "Reset RetroDECK to default settings" )
+ "${choices[@]}")
+
+ local emulator_list=(
+ "RetroArch" "Reset the multi-emulator frontend RetroArch to default settings"
+ "Cemu" "Reset the Wii U emulator Cemu to default settings"
+ "Dolphin" "Reset the Wii/GameCube emulator Dolphin to default settings"
+ "Duckstation" "Reset the PSX emulator Duckstation to default settings"
+ "GZDoom" "Reset the GZDoom Doom engine to default settings"
+ "MAME" "Reset the Multiple Arcade Machine Emulator (MAME) to default settings"
+ "MelonDS" "Reset the NDS emulator MelonDS to default settings"
+ "PCSX2" "Reset the PS2 emulator PCSX2 to default settings"
+ "PPSSPP" "Reset the PSP emulator PPSSPP to default settings"
+ "Primehack" "Reset the Metroid Prime emulator Primehack to default settings"
+ "RPCS3" "Reset the PS3 emulator RPCS3 to default settings"
+ "Ryujinx" "Reset the Switch emulator Ryujinx to default settings"
+ "Vita3k" "Reset the PS Vita emulator Vita3k to default settings"
+ "XEMU" "Reset the XBOX emulator XEMU to default settings"
+ )
+
+ # Check if any ponzu is true before adding Yuzu or Citra to the list
+ if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then
+ emulator_list+=("Yuzu" "Reset the Switch emulator Yuzu")
+ fi
+ if [[ $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" ]]; then
+ emulator_list+=("Citra" "Reset the 3DS emulator Citra")
+ fi
case $choice in
- "Reset Specific Emulator" )
+ "Reset Emulator or Engine" )
+ log i "Configurator: opening \"$choice\" menu"
component_to_reset=$(zenity --list \
--title "RetroDECK Configurator Utility - Reset Specific Standalone Emulator" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
--text="Which emulator or engine do you want to reset to default?" \
--column="Emulator" --column="Action" \
- "RetroArch" "Reset the multi-emulator frontend RetroArch to default settings" \
- "Cemu" "Reset the Wii U emulator Cemu to default settings" \
- "Citra" "Reset the N3DS emulator Citra to default settings" \
- "Dolphin" "Reset the Wii/GameCube emulator Dolphin to default settings" \
- "Duckstation" "Reset the PSX emulator Duckstation to default settings" \
- "GZDoom" "Reset the GZDoom Doom engine to default settings" \
- "MAME" "Reset the Multiple Arcade Machine Emulator (MAME) to default settings" \
- "MelonDS" "Reset the NDS emulator MelonDS to default settings" \
- "PCSX2" "Reset the PS2 emulator PCSX2 to default settings" \
- "PPSSPP" "Reset the PSP emulator PPSSPP to default settings" \
- "Primehack" "Reset the Metroid Prime emulator Primehack to default settings" \
- "RPCS3" "Reset the PS3 emulator RPCS3 to default settings" \
- "Vita3k" "Reset the PS Vita emulator Vita3k to default settings" \
- "XEMU" "Reset the XBOX emulator XEMU to default settings" \
- "Yuzu" "Reset the Switch emulator Yuzu to default settings" )
-
- # "Ryujinx" "Reset the Switch emulator Ryujinx to default settings" \
+ "${emulator_list[@]}")
case $component_to_reset in
@@ -1028,7 +1180,7 @@ configurator_reset_dialog() {
fi
;;
- "Cemu" | "Citra" | "Dolphin" | "Duckstation" | "MelonDS" | "MAME" | "PCSX2" | "PPSSPP" | "Primehack" | "RPCS3" | "Ryujinx" | "Yuzu" )
+ "Cemu" | "Citra" | "Dolphin" | "Duckstation" | "GZDoom" | "Yuzu" | "MelonDS" | "MAME" | "PCSX2" | "PPSSPP" | "Primehack" | "RPCS3" | "Ryujinx" )
if [[ $(configurator_reset_confirmation_dialog "$component_to_reset" "Are you sure you want to reset the $component_to_reset emulator to default settings?\n\nThis process cannot be undone.") == "true" ]]; then
prepare_component "reset" "$component_to_reset" "configurator"
configurator_process_complete_dialog "resetting $component_to_reset"
@@ -1049,9 +1201,9 @@ configurator_reset_dialog() {
component_to_reset=$(zenity --list \
--title "RetroDECK Configurator Utility - Reset Specific RetroDECK Component" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
- --text="Which component do you want to reset to default?" \
+ --text="Which component do you want to reset to default settings?" \
--column="Component" --column="Action" \
- "BoilR" "Reset BoilR that manages the sync and scraping toward Steam library" \
+ "BoilR" "Reset BoilR that manages the sync and scraping toward Steam library" \
"ES-DE" "Reset the ES-DE frontend" \ )
# TODO: "GyroDSU" "Reset the gyroscope manager GyroDSU"
@@ -1074,7 +1226,8 @@ configurator_reset_dialog() {
esac
;;
-"Reset All Emulators" )
+"Reset All Emulators and Components" )
+ log i "Configurator: opening \"$choice\" menu"
if [[ $(check_network_connectivity) == "true" ]]; then
if [[ $(configurator_reset_confirmation_dialog "all emulators" "Are you sure you want to reset all emulators to default settings?\n\nThis process cannot be undone.") == "true" ]]; then
(
@@ -1096,6 +1249,7 @@ configurator_reset_dialog() {
;;
"Reset RetroDECK" )
+ log i "Configurator: opening \"$choice\" menu"
if [[ $(configurator_reset_confirmation_dialog "RetroDECK" "Are you sure you want to reset RetroDECK entirely?\n\nThis process cannot be undone.") == "true" ]]; then
zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
@@ -1127,10 +1281,12 @@ configurator_about_retrodeck_dialog() {
case $choice in
"Version History" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_version_history_dialog
;;
"Credits" )
+ log i "Configurator: opening \"$choice\" menu"
zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Credits" \
@@ -1139,6 +1295,7 @@ configurator_about_retrodeck_dialog() {
;;
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_welcome_dialog
;;
@@ -1150,7 +1307,7 @@ configurator_add_steam() {
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK Steam Syncronization" \
- --text="Steam syncronization is current enabled. Do you want to disable it?\n\nThe already added shortcut will not be removed.\n"
+ --text="Steam syncronization is currently enabled. Do you want to disable it?\n\nThe already added shortcut will not be removed.\n"
if [ $? == 0 ] # User clicked "Yes"
then
@@ -1162,7 +1319,7 @@ configurator_add_steam() {
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK Steam Syncronization" \
- --text="Steam syncronization is current disabled. Do you want to enable it?\n\nAll the games marked as favorites will be syncronized with Steam thanks to BoilR.\nRemember to restart Steam each time to see the changes.\n"
+ --text="Steam syncronization is currently disabled. Do you want to enable it?\n\nAll the games marked as favorites will be syncronized with Steam thanks to BoilR.\nRemember to restart Steam each time to see the changes.\n"
if [ $? == 0 ]
then
@@ -1205,10 +1362,12 @@ configurator_version_history_dialog() {
case $choice in
"Full RetroDECK Changelog" )
+ log i "Configurator: opening \"$choice\" menu"
changelog_dialog "all"
;;
"RetroDECK"*"Changelog" )
+ log i "Configurator: opening \"$choice\" menu"
local version=$(echo "$choice" | sed 's/^RetroDECK \(.*\) Changelog$/\1/')
changelog_dialog "$version"
;;
@@ -1232,23 +1391,28 @@ configurator_developer_dialog() {
case $choice in
"Change Multi-user mode" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_retrodeck_multiuser_dialog
;;
"Change Update Channel" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_online_update_channel_dialog
;;
"Browse the Wiki" )
+ log i "Configurator: opening \"$choice\" menu"
xdg-open "https://github.com/XargonWan/RetroDECK/wiki"
configurator_developer_dialog
;;
"USB Import" )
+ log i "Configurator: opening \"$choice\" menu"
configurator_usb_import_dialog
;;
"Install RetroDECK Starter Pack" )
+ log i "Configurator: opening \"$choice\" menu"
if [[ $(configurator_generic_question_dialog "Install: RetroDECK Starter Pack" "The RetroDECK creators have put together a collection of classic retro games you might enjoy!\n\nWould you like to have them automatically added to your library?") == "true" ]]; then
install_retrodeck_starterpack
fi
@@ -1260,6 +1424,7 @@ configurator_developer_dialog() {
;;
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_welcome_dialog
;;
esac
@@ -1270,7 +1435,7 @@ configurator_retrodeck_multiuser_dialog() {
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK Multi-user Support" \
- --text="Multi-user support is current enabled. Do you want to disable it?\n\nIf there are more than one user configured,\nyou will be given a choice of which to use as the single RetroDECK user.\n\nThis users files will be moved to the default locations.\n\nOther users files will remain in the mutli-user-data folder.\n"
+ --text="Multi-user support is currently enabled. Do you want to disable it?\n\nIf there is more than one user configured,\nyou will be given a choice of which to use as the single RetroDECK user.\n\nThis user's files will be moved to the default locations.\n\nOther users' files will remain in the mutli-user-data folder.\n"
if [ $? == 0 ] # User clicked "Yes"
then
@@ -1282,7 +1447,7 @@ configurator_retrodeck_multiuser_dialog() {
zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK Multi-user support" \
- --text="Multi-user support is current disabled. Do you want to enable it?\n\nThe current users saves and states will be backed up and then moved to the \"retrodeck/multi-user-data\" folder.\nAdditional users will automatically be stored in their own folder here as they are added."
+ --text="Multi-user support is currently disabled. Do you want to enable it?\n\nThe current user's saves and states will be backed up and then moved to the \"retrodeck/multi-user-data\" folder.\nAdditional users will automatically be stored in their own folder here as they are added."
if [ $? == 0 ]
then
@@ -1331,6 +1496,7 @@ configurator_usb_import_dialog() {
case $choice in
"Prepare USB device" )
+ log i "Configurator: opening \"$choice\" menu"
external_devices=()
while read -r size device_path; do
@@ -1348,7 +1514,7 @@ configurator_usb_import_dialog() {
"${external_devices[@]}")
if [[ ! -z "$choice" ]]; then
- emulationstation --home "$choice" --create-system-dirs
+ es-de --home "$choice" --create-system-dirs
rm -rf "$choice/ES-DE" # Cleanup unnecessary folder
fi
else
@@ -1358,6 +1524,7 @@ configurator_usb_import_dialog() {
;;
"Import from USB" )
+ log i "Configurator: opening \"$choice\" menu"
external_devices=()
while read -r size device_path; do
@@ -1404,6 +1571,7 @@ configurator_usb_import_dialog() {
;;
"" ) # No selection made or Back button clicked
+ log i "Configurator: going back"
configurator_developer_dialog
;;
esac
diff --git a/tools/retrodeck_function_wrapper.sh b/tools/retrodeck_function_wrapper.sh
index 98148ab8..03659d84 100644
--- a/tools/retrodeck_function_wrapper.sh
+++ b/tools/retrodeck_function_wrapper.sh
@@ -7,7 +7,7 @@ source /app/libexec/global.sh
# Check if a function was specified
if [[ $# -lt 1 ]]; then
- echo "Usage: $0 function_name [args...]"
+ log e "Usage: $0 function_name [args...]"
exit 1
fi
@@ -17,7 +17,7 @@ shift
# Check if the function exists
if ! declare -f "$function_name" >/dev/null 2>&1; then
- echo "Function '$function_name' not found"
+ log e "Function \'$function_name\' not found"
exit 1
fi