diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index cae8e18c5..9883b0e10 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -35,12 +35,12 @@ jobs: python -m pip install --no-cache-dir --require-hashes -r src/common/db/requirements.txt echo "CODEQL_PYTHON=$(which python)" >> $GITHUB_ENV - name: Initialize CodeQL - uses: github/codeql-action/init@df5a14dc28094dc936e103b37d749c6628682b60 # v3.25.0 + uses: github/codeql-action/init@c7f9125735019aa87cfc361530512d50ea439c71 # v3.25.1 with: languages: ${{ matrix.language }} config-file: ./.github/codeql.yml setup-python-dependencies: false - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@df5a14dc28094dc936e103b37d749c6628682b60 # v3.25.0 + uses: github/codeql-action/analyze@c7f9125735019aa87cfc361530512d50ea439c71 # v3.25.1 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/doc-to-pdf.yml b/.github/workflows/doc-to-pdf.yml index 53616a2f3..cf1140e4f 100644 --- a/.github/workflows/doc-to-pdf.yml +++ b/.github/workflows/doc-to-pdf.yml @@ -32,7 +32,7 @@ jobs: run: mkdocs serve & sleep 10 - name: Run pdf script run: node docs/misc/pdf.js http://localhost:8000/print_page/ BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf 'BunkerWeb documentation v${{ inputs.VERSION }}' - - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + - uses: actions/upload-artifact@1746f4ab65b179e0ea60a494b83293b640dd5bba # v4.3.2 with: name: BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf path: BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index 55afc727c..1a4e367d6 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -129,7 +129,7 @@ jobs: scp -r root@arm:/root/package-${{ inputs.LINUX }} ./package-${{ inputs.LINUX }} env: LARCH: ${{ env.LARCH }} - - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + - uses: actions/upload-artifact@1746f4ab65b179e0ea60a494b83293b640dd5bba # v4.3.2 with: name: package-${{ inputs.LINUX }}-${{ env.LARCH }} path: package-${{ inputs.LINUX }}/*.${{ inputs.PACKAGE }} diff --git a/.github/workflows/push-github.yml b/.github/workflows/push-github.yml index ad8088ed1..f36edcc1e 100644 --- a/.github/workflows/push-github.yml +++ b/.github/workflows/push-github.yml @@ -19,7 +19,7 @@ jobs: # Get PDF doc - name: Get documentation if: inputs.VERSION != 'testing' - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@8caf195ad4b1dee92908e23f56eeb0696f1dd42d # v4.1.5 with: name: BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf # Create tag diff --git a/.github/workflows/push-packagecloud.yml b/.github/workflows/push-packagecloud.yml index d4122a12b..36300da8e 100644 --- a/.github/workflows/push-packagecloud.yml +++ b/.github/workflows/push-packagecloud.yml @@ -42,18 +42,18 @@ jobs: - name: Check out repository code uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Install ruby - uses: ruby/setup-ruby@5f19ec79cedfadb78ab837f95b87734d0003c899 # v1.173.0 + uses: ruby/setup-ruby@6bd3d993c602f6b675728ebaecb2b569ff86e99b # v1.174.0 with: ruby-version: "3.0" - name: Install packagecloud run: gem install package_cloud # Download packages - - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + - uses: actions/download-artifact@8caf195ad4b1dee92908e23f56eeb0696f1dd42d # v4.1.5 if: inputs.LINUX != 'el' && inputs.LINUX != 'el9' with: name: package-${{ inputs.LINUX }}-${{ inputs.PACKAGE_ARCH }} path: /tmp/${{ inputs.LINUX }} - - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + - uses: actions/download-artifact@8caf195ad4b1dee92908e23f56eeb0696f1dd42d # v4.1.5 if: inputs.LINUX == 'el' || inputs.LINUX == 'el9' with: name: package-rh${{ inputs.LINUX }}-${{ inputs.PACKAGE_ARCH }} diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml index d4e05a12b..81f0fc49c 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml @@ -25,6 +25,6 @@ jobs: results_format: sarif publish_results: true - name: "Upload SARIF results to code scanning" - uses: github/codeql-action/upload-sarif@df5a14dc28094dc936e103b37d749c6628682b60 # v3.25.0 + uses: github/codeql-action/upload-sarif@c7f9125735019aa87cfc361530512d50ea439c71 # v3.25.1 with: sarif_file: results.sarif diff --git a/.github/workflows/staging-create-infra.yml b/.github/workflows/staging-create-infra.yml index 5407dcee2..8635ca663 100644 --- a/.github/workflows/staging-create-infra.yml +++ b/.github/workflows/staging-create-infra.yml @@ -52,7 +52,7 @@ jobs: if: always() env: SECRET_KEY: ${{ secrets.SECRET_KEY }} - - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + - uses: actions/upload-artifact@1746f4ab65b179e0ea60a494b83293b640dd5bba # v4.3.2 if: always() with: name: tf-${{ inputs.TYPE }} diff --git a/.github/workflows/staging-delete-infra.yml b/.github/workflows/staging-delete-infra.yml index 68c8eadfc..af1c07fe1 100644 --- a/.github/workflows/staging-delete-infra.yml +++ b/.github/workflows/staging-delete-infra.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Install terraform uses: hashicorp/setup-terraform@a1502cd9e758c50496cc9ac5308c4843bcd56d36 # v3.0.0 - - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + - uses: actions/download-artifact@8caf195ad4b1dee92908e23f56eeb0696f1dd42d # v4.1.5 with: name: tf-${{ inputs.TYPE }} path: /tmp diff --git a/.github/workflows/staging-tests.yml b/.github/workflows/staging-tests.yml index b3bfb9af5..d2630c69b 100644 --- a/.github/workflows/staging-tests.yml +++ b/.github/workflows/staging-tests.yml @@ -43,7 +43,7 @@ jobs: if: inputs.TYPE == 'swarm' - name: Install test dependencies run: PIP_BREAK_SYSTEM_PACKAGES=1 pip3 install --no-cache-dir --require-hashes --no-deps -r tests/requirements.txt - - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + - uses: actions/download-artifact@8caf195ad4b1dee92908e23f56eeb0696f1dd42d # v4.1.5 with: name: tf-k8s path: /tmp diff --git a/.gitleaksignore b/.gitleaksignore index d94d0d37b..99ebe060b 100644 --- a/.gitleaksignore +++ b/.gitleaksignore @@ -9,3 +9,4 @@ src/ui/templates/settings_plugins.html:hashicorp-tf-password:87 src/ui/templates/settings_plugins.html:hashicorp-tf-password:297 src/ui/templates/settings_plugins.html:hashicorp-tf-password:106 src/ui/templates/account.html:hashicorp-tf-password:154 +src/ui/templates/account.html:hashicorp-tf-password:162 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3626b5f55..7044bf6c2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ exclude: (^LICENSE.md$|^src/VERSION$|^env/|^src/(bw/misc/root-ca.pem$|deps/src/|common/core/modsecurity/files|ui/static/(js/(editor/|utils/purify/|tsparticles\.bundle\.min\.js)|css/dashboard\.css))|\.(svg|drawio|patch\d?|ascii|tf|tftpl|key)$) repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: c4a0b883114b00d8d76b479c820ce7950211c99b # frozen: v4.5.0 + rev: 2c9f875913ee60ca25ce70243dc24d5b6415598c # frozen: v4.6.0 hooks: - id: requirements-txt-fixer name: Fix requirements.txt and requirements.in files @@ -17,7 +17,7 @@ repos: - id: check-case-conflict - repo: https://github.com/psf/black - rev: 552baf822992936134cbd31a38f69c8cfe7c0f05 # frozen: 24.3.0 + rev: 8fe627072f15ff2e3d380887b92f7868efaf6d05 # frozen: 24.4.0 hooks: - id: black name: Black Python Formatter diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f8bae2d3..258f96c12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,17 @@ - [FEATURE] Add backup plugin to backup and restore easily the database - [FEATURE] Add LETS_ENCRYPT_CLEAR_OLD_CERTS setting to control if old certificates should be removed when generating Let's Encrypt certificates (default is no) - [FEATURE] Add DISABLE_DEFAULT_SERVER_STRICT_SNI setting to allow/block requests when SNI is unknown or unset (default is no) +- [UI] General : fix tooltip crop because of overflow +- [UI] General : fix select setting crop because of overflow and check if select is out of viewport to determine visible position +- [UI] General : show logs on UI when pre rendering issue +- [UI] Global config : fix script error while fragment relate to a missing plugin +- [UI] Global config / services page : filtering settings now open plugin select to highlight remaining plugin +- [UI] Global config / services page : add combobox on plugin select open to search a plugin quick +- [UI] Global config / services page : add combobox on plugin select open to search a plugin quick +- [UI] Reporting page : fix missing data and add new ones +- [UI] Account page : keep license key form even if pro register to easy update + + - [DOCUMENTATION] Add upgrade procedure for 1.5.7+ - [MISC] Support custom bwcli commands using plugins - [DEPS] Updated LuaJIT version to v2.1-20240314 diff --git a/docs/assets/img/crowdity1.png b/docs/assets/img/crowdity1.png new file mode 100644 index 000000000..1f07a101a Binary files /dev/null and b/docs/assets/img/crowdity1.png differ diff --git a/docs/assets/img/crowdity2.png b/docs/assets/img/crowdity2.png new file mode 100644 index 000000000..f7809672e Binary files /dev/null and b/docs/assets/img/crowdity2.png differ diff --git a/docs/assets/img/crowdity3.png b/docs/assets/img/crowdity3.png new file mode 100644 index 000000000..c1b985742 Binary files /dev/null and b/docs/assets/img/crowdity3.png differ diff --git a/docs/assets/img/crowdity4.png b/docs/assets/img/crowdity4.png new file mode 100644 index 000000000..fefc58fae Binary files /dev/null and b/docs/assets/img/crowdity4.png differ diff --git a/docs/integrations.md b/docs/integrations.md index ff14c2b30..48881f548 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -979,6 +979,10 @@ To simplify the installation process, Linux package repositories for BunkerWeb a !!! warning "Testing/dev version" If you use the `testing` or `dev` version, you will need to add the `force-bad-version` directive to your `/etc/dpkg/dpkg.cfg` file before installing BunkerWeb. + ```shell + echo "force-bad-version" | sudo tee -a /etc/dpkg/dpkg.cfg + ``` + Optional step : if you want to automatically enable the [setup wizard](web-ui.md#setup-wizard) when BunkerWeb is installed, export the following variable : ```shell @@ -1022,6 +1026,10 @@ To simplify the installation process, Linux package repositories for BunkerWeb a !!! warning "Testing/dev version" If you use the `testing` or `dev` version, you will need to add the `force-bad-version` directive to your `/etc/dpkg/dpkg.cfg` file before installing BunkerWeb. + ```shell + echo "force-bad-version" | sudo tee -a /etc/dpkg/dpkg.cfg + ``` + Optional step : if you want to automatically enable the [setup wizard](web-ui.md#setup-wizard) when BunkerWeb is installed, export the following variable : ```shell @@ -1110,7 +1118,7 @@ To simplify the installation process, Linux package repositories for BunkerWeb a And finally install BunkerWeb 1.5.7 : ```shell - dnf install -y epel-release && \ + sudo dnf install -y epel-release && \ curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.rpm.sh | sudo bash && \ sudo dnf check-update && \ sudo -E dnf install -y bunkerweb-1.5.7 diff --git a/docs/requirements.txt b/docs/requirements.txt index 2d81e4228..56134b70e 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -510,100 +510,100 @@ pyyaml-env-tag==0.1 \ --hash=sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb \ --hash=sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069 # via mkdocs -regex==2023.12.25 \ - --hash=sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5 \ - --hash=sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770 \ - --hash=sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc \ - --hash=sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105 \ - --hash=sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d \ - --hash=sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b \ - --hash=sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9 \ - --hash=sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630 \ - --hash=sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6 \ - --hash=sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c \ - --hash=sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482 \ - --hash=sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6 \ - --hash=sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a \ - --hash=sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80 \ - --hash=sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5 \ - --hash=sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1 \ - --hash=sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f \ - --hash=sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf \ - --hash=sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb \ - --hash=sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2 \ - --hash=sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347 \ - --hash=sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20 \ - --hash=sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060 \ - --hash=sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5 \ - --hash=sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73 \ - --hash=sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f \ - --hash=sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d \ - --hash=sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3 \ - --hash=sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae \ - --hash=sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4 \ - --hash=sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2 \ - --hash=sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457 \ - --hash=sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c \ - --hash=sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4 \ - --hash=sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87 \ - --hash=sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0 \ - --hash=sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704 \ - --hash=sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f \ - --hash=sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f \ - --hash=sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b \ - --hash=sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5 \ - --hash=sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923 \ - --hash=sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715 \ - --hash=sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c \ - --hash=sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca \ - --hash=sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1 \ - --hash=sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756 \ - --hash=sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360 \ - --hash=sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc \ - --hash=sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445 \ - --hash=sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e \ - --hash=sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4 \ - --hash=sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a \ - --hash=sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8 \ - --hash=sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53 \ - --hash=sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697 \ - --hash=sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf \ - --hash=sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a \ - --hash=sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415 \ - --hash=sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f \ - --hash=sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9 \ - --hash=sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400 \ - --hash=sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d \ - --hash=sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392 \ - --hash=sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb \ - --hash=sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd \ - --hash=sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861 \ - --hash=sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232 \ - --hash=sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95 \ - --hash=sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7 \ - --hash=sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39 \ - --hash=sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887 \ - --hash=sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5 \ - --hash=sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39 \ - --hash=sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb \ - --hash=sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586 \ - --hash=sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97 \ - --hash=sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423 \ - --hash=sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69 \ - --hash=sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7 \ - --hash=sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1 \ - --hash=sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7 \ - --hash=sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5 \ - --hash=sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8 \ - --hash=sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91 \ - --hash=sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590 \ - --hash=sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe \ - --hash=sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c \ - --hash=sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64 \ - --hash=sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd \ - --hash=sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa \ - --hash=sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31 \ - --hash=sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988 +regex==2024.4.16 \ + --hash=sha256:00169caa125f35d1bca6045d65a662af0202704489fada95346cfa092ec23f39 \ + --hash=sha256:03576e3a423d19dda13e55598f0fd507b5d660d42c51b02df4e0d97824fdcae3 \ + --hash=sha256:03e68f44340528111067cecf12721c3df4811c67268b897fbe695c95f860ac42 \ + --hash=sha256:0534b034fba6101611968fae8e856c1698da97ce2efb5c2b895fc8b9e23a5834 \ + --hash=sha256:08dea89f859c3df48a440dbdcd7b7155bc675f2fa2ec8c521d02dc69e877db70 \ + --hash=sha256:0a38d151e2cdd66d16dab550c22f9521ba79761423b87c01dae0a6e9add79c0d \ + --hash=sha256:0c8290b44d8b0af4e77048646c10c6e3aa583c1ca67f3b5ffb6e06cf0c6f0f89 \ + --hash=sha256:10188fe732dec829c7acca7422cdd1bf57d853c7199d5a9e96bb4d40db239c73 \ + --hash=sha256:1210365faba7c2150451eb78ec5687871c796b0f1fa701bfd2a4a25420482d26 \ + --hash=sha256:12f6a3f2f58bb7344751919a1876ee1b976fe08b9ffccb4bbea66f26af6017b9 \ + --hash=sha256:159dc4e59a159cb8e4e8f8961eb1fa5d58f93cb1acd1701d8aff38d45e1a84a6 \ + --hash=sha256:20b7a68444f536365af42a75ccecb7ab41a896a04acf58432db9e206f4e525d6 \ + --hash=sha256:23cff1b267038501b179ccbbd74a821ac4a7192a1852d1d558e562b507d46013 \ + --hash=sha256:2c72608e70f053643437bd2be0608f7f1c46d4022e4104d76826f0839199347a \ + --hash=sha256:3399dd8a7495bbb2bacd59b84840eef9057826c664472e86c91d675d007137f5 \ + --hash=sha256:34422d5a69a60b7e9a07a690094e824b66f5ddc662a5fc600d65b7c174a05f04 \ + --hash=sha256:370c68dc5570b394cbaadff50e64d705f64debed30573e5c313c360689b6aadc \ + --hash=sha256:3a1018e97aeb24e4f939afcd88211ace472ba566efc5bdf53fd8fd7f41fa7170 \ + --hash=sha256:3d5ac5234fb5053850d79dd8eb1015cb0d7d9ed951fa37aa9e6249a19aa4f336 \ + --hash=sha256:4313ab9bf6a81206c8ac28fdfcddc0435299dc88cad12cc6305fd0e78b81f9e4 \ + --hash=sha256:445ca8d3c5a01309633a0c9db57150312a181146315693273e35d936472df912 \ + --hash=sha256:479595a4fbe9ed8f8f72c59717e8cf222da2e4c07b6ae5b65411e6302af9708e \ + --hash=sha256:4918fd5f8b43aa7ec031e0fef1ee02deb80b6afd49c85f0790be1dc4ce34cb50 \ + --hash=sha256:4aba818dcc7263852aabb172ec27b71d2abca02a593b95fa79351b2774eb1d2b \ + --hash=sha256:4e819a806420bc010489f4e741b3036071aba209f2e0989d4750b08b12a9343f \ + --hash=sha256:4facc913e10bdba42ec0aee76d029aedda628161a7ce4116b16680a0413f658a \ + --hash=sha256:549c3584993772e25f02d0656ac48abdda73169fe347263948cf2b1cead622f3 \ + --hash=sha256:5c02fcd2bf45162280613d2e4a1ca3ac558ff921ae4e308ecb307650d3a6ee51 \ + --hash=sha256:5f580c651a72b75c39e311343fe6875d6f58cf51c471a97f15a938d9fe4e0d37 \ + --hash=sha256:62120ed0de69b3649cc68e2965376048793f466c5a6c4370fb27c16c1beac22d \ + --hash=sha256:6295004b2dd37b0835ea5c14a33e00e8cfa3c4add4d587b77287825f3418d310 \ + --hash=sha256:65436dce9fdc0aeeb0a0effe0839cb3d6a05f45aa45a4d9f9c60989beca78b9c \ + --hash=sha256:684008ec44ad275832a5a152f6e764bbe1914bea10968017b6feaecdad5736e0 \ + --hash=sha256:684e52023aec43bdf0250e843e1fdd6febbe831bd9d52da72333fa201aaa2335 \ + --hash=sha256:6cc38067209354e16c5609b66285af17a2863a47585bcf75285cab33d4c3b8df \ + --hash=sha256:6f2f017c5be19984fbbf55f8af6caba25e62c71293213f044da3ada7091a4455 \ + --hash=sha256:743deffdf3b3481da32e8a96887e2aa945ec6685af1cfe2bcc292638c9ba2f48 \ + --hash=sha256:7571f19f4a3fd00af9341c7801d1ad1967fc9c3f5e62402683047e7166b9f2b4 \ + --hash=sha256:7731728b6568fc286d86745f27f07266de49603a6fdc4d19c87e8c247be452af \ + --hash=sha256:785c071c982dce54d44ea0b79cd6dfafddeccdd98cfa5f7b86ef69b381b457d9 \ + --hash=sha256:78fddb22b9ef810b63ef341c9fcf6455232d97cfe03938cbc29e2672c436670e \ + --hash=sha256:7bb966fdd9217e53abf824f437a5a2d643a38d4fd5fd0ca711b9da683d452969 \ + --hash=sha256:7cbc5d9e8a1781e7be17da67b92580d6ce4dcef5819c1b1b89f49d9678cc278c \ + --hash=sha256:803b8905b52de78b173d3c1e83df0efb929621e7b7c5766c0843704d5332682f \ + --hash=sha256:80b696e8972b81edf0af2a259e1b2a4a661f818fae22e5fa4fa1a995fb4a40fd \ + --hash=sha256:81500ed5af2090b4a9157a59dbc89873a25c33db1bb9a8cf123837dcc9765047 \ + --hash=sha256:89ec7f2c08937421bbbb8b48c54096fa4f88347946d4747021ad85f1b3021b3c \ + --hash=sha256:8ba6745440b9a27336443b0c285d705ce73adb9ec90e2f2004c64d95ab5a7598 \ + --hash=sha256:8c91e1763696c0eb66340c4df98623c2d4e77d0746b8f8f2bee2c6883fd1fe18 \ + --hash=sha256:8d015604ee6204e76569d2f44e5a210728fa917115bef0d102f4107e622b08d5 \ + --hash=sha256:8d1f86f3f4e2388aa3310b50694ac44daefbd1681def26b4519bd050a398dc5a \ + --hash=sha256:8f83b6fd3dc3ba94d2b22717f9c8b8512354fd95221ac661784df2769ea9bba9 \ + --hash=sha256:8fc6976a3395fe4d1fbeb984adaa8ec652a1e12f36b56ec8c236e5117b585427 \ + --hash=sha256:904c883cf10a975b02ab3478bce652f0f5346a2c28d0a8521d97bb23c323cc8b \ + --hash=sha256:911742856ce98d879acbea33fcc03c1d8dc1106234c5e7d068932c945db209c0 \ + --hash=sha256:91797b98f5e34b6a49f54be33f72e2fb658018ae532be2f79f7c63b4ae225145 \ + --hash=sha256:95399831a206211d6bc40224af1c635cb8790ddd5c7493e0bd03b85711076a53 \ + --hash=sha256:956b58d692f235cfbf5b4f3abd6d99bf102f161ccfe20d2fd0904f51c72c4c66 \ + --hash=sha256:98c1165f3809ce7774f05cb74e5408cd3aa93ee8573ae959a97a53db3ca3180d \ + --hash=sha256:9ab40412f8cd6f615bfedea40c8bf0407d41bf83b96f6fc9ff34976d6b7037fd \ + --hash=sha256:9df1bfef97db938469ef0a7354b2d591a2d438bc497b2c489471bec0e6baf7c4 \ + --hash=sha256:a01fe2305e6232ef3e8f40bfc0f0f3a04def9aab514910fa4203bafbc0bb4682 \ + --hash=sha256:a70b51f55fd954d1f194271695821dd62054d949efd6368d8be64edd37f55c86 \ + --hash=sha256:a7ccdd1c4a3472a7533b0a7aa9ee34c9a2bef859ba86deec07aff2ad7e0c3b94 \ + --hash=sha256:b340cccad138ecb363324aa26893963dcabb02bb25e440ebdf42e30963f1a4e0 \ + --hash=sha256:b74586dd0b039c62416034f811d7ee62810174bb70dffcca6439f5236249eb09 \ + --hash=sha256:b9d320b3bf82a39f248769fc7f188e00f93526cc0fe739cfa197868633d44701 \ + --hash=sha256:ba2336d6548dee3117520545cfe44dc28a250aa091f8281d28804aa8d707d93d \ + --hash=sha256:ba8122e3bb94ecda29a8de4cf889f600171424ea586847aa92c334772d200331 \ + --hash=sha256:bd727ad276bb91928879f3aa6396c9a1d34e5e180dce40578421a691eeb77f47 \ + --hash=sha256:c21fc21a4c7480479d12fd8e679b699f744f76bb05f53a1d14182b31f55aac76 \ + --hash=sha256:c2d0e7cbb6341e830adcbfa2479fdeebbfbb328f11edd6b5675674e7a1e37730 \ + --hash=sha256:c2ef6f7990b6e8758fe48ad08f7e2f66c8f11dc66e24093304b87cae9037bb4a \ + --hash=sha256:c4ed75ea6892a56896d78f11006161eea52c45a14994794bcfa1654430984b22 \ + --hash=sha256:cccc79a9be9b64c881f18305a7c715ba199e471a3973faeb7ba84172abb3f317 \ + --hash=sha256:d0800631e565c47520aaa04ae38b96abc5196fe8b4aa9bd864445bd2b5848a7a \ + --hash=sha256:d2da13568eff02b30fd54fccd1e042a70fe920d816616fda4bf54ec705668d81 \ + --hash=sha256:d61ae114d2a2311f61d90c2ef1358518e8f05eafda76eaf9c772a077e0b465ec \ + --hash=sha256:d83c2bc678453646f1a18f8db1e927a2d3f4935031b9ad8a76e56760461105dd \ + --hash=sha256:dd5acc0a7d38fdc7a3a6fd3ad14c880819008ecb3379626e56b163165162cc46 \ + --hash=sha256:df79012ebf6f4efb8d307b1328226aef24ca446b3ff8d0e30202d7ebcb977a8c \ + --hash=sha256:e0a2df336d1135a0b3a67f3bbf78a75f69562c1199ed9935372b82215cddd6e2 \ + --hash=sha256:e2f142b45c6fed48166faeb4303b4b58c9fcd827da63f4cf0a123c3480ae11fb \ + --hash=sha256:e697e1c0238133589e00c244a8b676bc2cfc3ab4961318d902040d099fec7483 \ + --hash=sha256:e757d475953269fbf4b441207bb7dbdd1c43180711b6208e129b637792ac0b93 \ + --hash=sha256:e87ab229332ceb127a165612d839ab87795972102cb9830e5f12b8c9a5c1b508 \ + --hash=sha256:ea355eb43b11764cf799dda62c658c4d2fdb16af41f59bb1ccfec517b60bcb07 \ + --hash=sha256:ec7e0043b91115f427998febaa2beb82c82df708168b35ece3accb610b91fac1 \ + --hash=sha256:eeaa0b5328b785abc344acc6241cffde50dc394a0644a968add75fcefe15b9d4 \ + --hash=sha256:f2d80a6749724b37853ece57988b39c4e79d2b5fe2869a86e8aeae3bbeef9eb0 \ + --hash=sha256:fa454d26f2e87ad661c4f0c5a5fe4cf6aab1e307d1b94f16ffdfcb089ba685c0 \ + --hash=sha256:fb83cc090eac63c006871fd24db5e30a1f282faa46328572661c0a24a2323a08 \ + --hash=sha256:fd80d1280d473500d8086d104962a82d77bfbf2b118053824b7be28cd5a79ea5 # via mkdocs-material requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ diff --git a/docs/security-tuning.md b/docs/security-tuning.md index 5f9c62cb1..afc366ab9 100644 --- a/docs/security-tuning.md +++ b/docs/security-tuning.md @@ -442,10 +442,72 @@ BunkerNet is a crowdsourced database of malicious requests shared between all Bu If you enable BunkerNet, malicious requests will be sent to a remote server and will be analyzed by our systems. By doing so, we can extract malicious data from everyone's reports and give back the results to each BunkerWeb instances participating into BunkerNet. -At the moment, that feature should be considered in "beta". We only extract malicious IP and we are very strict about how we do it to avoid any "poisoning". We strongly recommend activating it (which is the default) because the more instances participate, the more data we have to improve the algorithm. +Besides the enhanced security, enabling BunkerNet will let you benefit from extra features such as the integration with CrowdSec Console. The setting used to enable or disable BunkerNet is `USE_BUNKERNET` (default : `yes`). +### CrowdSec Console integration + +If you don't already know about it, [CrowdSec](https://www.crowdsec.net/?utm_campaign=bunkerweb&utm_source=doc) is an open-source cybersecurity solution leveraging crowdsourced intelligence to mitigate cyber threats. Think of it like Waze but applied to cybersecurity : when a specific server is attacked, other systems around the globe will be informed and protected from the same attackers. You will find more information on their website [here](https://www.crowdsec.net/about?utm_campaign=bunkerweb&utm_source=blog). + +Thanks to a partnership with CrowdSec, you can enroll your BunkerWeb instances to your [CrowdSec Console](https://app.crowdsec.net/signup?utm_source=external-blog&utm_medium=cta&utm_campaign=bunker-web-integration). In other words, the attacks blocked by BunkerWeb will be visible the same way it does for attacks blocked by CrowdSec Security Engines. + +Please note that CrowdSec doesn't need to be installed at all (even if we recommend you to try it with the [CrowdSec plugin for BunkerWeb](https://github.com/bunkerity/bunkerweb-plugins/tree/main/crowdsec) to enhance the security of your web services) and you can still enroll your Security Engines into the same Console account. + +**Step #1 : create your CrowdSec Console account** + +Go to the [CrowdSec Console](https://app.crowdsec.net/signup?utm_source=external-blog&utm_medium=cta&utm_campaign=bunker-web-integration) and register your account if you don't already have one. Once it's done, write down your enroll key by going to "Security Engines", then "Engines" and click on "Add Security Engine" : + +
+ ![Overview](assets/img/crowdity1.png){ align=center } +
Get your Crowdsec Console enroll key
+
+ +**Step #2 : get your BunkerNet ID** + +Activating the BunkerNet feature (which is the case by default) is mandatory if you want to enroll your BunkerWeb instance(s) into your CrowdSec console. You can do it by setting `USE_BUNKERNET` to `yes`. + +Get your BunkerNet ID on Docker : + +```shell +docker exec my-bw-scheduler cat /var/cache/bunkerweb/bunkernet/instance.id +``` + +Get your BunkerNet ID on Linux : + +```shell +cat /var/cache/bunkerweb/bunkernet/instance.id +``` + +**Step #3 : enroll your instance using the Panel** + +Once you have noted your BunkerNet ID and CrowdSec Console enroll key, you can [order the free product "BunkerNet / CrowdSec" on the Panel](https://panel.bunkerweb.io/order/bunkernet/11?utm_campaign=self&utm_source=doc). Please note that you will need to create an account if you don't already have one. + +You can now select the "BunkerNet / CrowdSec" service and fill out the form by pasting your BunkerNet ID and CrowdSec Console enroll key : + +
+ ![Overview](assets/img/crowdity2.png){ align=center } +
Enroll your BunkerWeb instance into the CrowdSec Console
+
+ +**Step #4 : accept new security engine on the Console** + +Last but not least, you need to go back to your CrowdSec Console and accept the new Security Engine : + +
+ ![Overview](assets/img/crowdity3.png){ align=center } +
Accept enroll into the CrowdSec Console
+
+ +**Congratulations, your BunkerWeb instance is now enrolled into your CrowdSec Console !** + +Pro tip : when viewing your alerts, click on "columns" and tick the "context" checkbox to get access to BunkerWeb specific data. + +
+ ![Overview](assets/img/crowdity4.png){ align=center } +
BunkerWeb data shown in the context column
+
+ ## DNSBL STREAM support :white_check_mark: @@ -640,9 +702,11 @@ The Reporting plugin provides a comprehensive solution for regular reporting of ## Backup and restore +### Backup + STREAM support :white_check_mark: -### Automated backup +#### Automated backup !!! warning "Information for Red Hat Enterprise Linux (RHEL) 8.9 users" If you are using **RHEL 8.9** and plan on using an **external database**, you will need to install the `mysql-community-client` package to ensure the `mysqldump` command is available. You can install the package by executing the following commands: @@ -696,7 +760,7 @@ Data is invaluable, especially in digital environments where it's susceptible to | `BACKUP_SCHEDULE` | `daily` | global | no | The frequency of the backup | | `BACKUP_ROTATION` | `7` | global | no | The number of backups to keep | -### Manual backup +#### Manual backup To manually initiate a backup, execute the following command: @@ -725,7 +789,11 @@ You can also specify a custom directory for the backup by providing the `BACKUP_ === "Docker" ```bash - docker exec -it -e BACKUP_DIRECTORY=/path/to/backup/directory -v /path/to/backup/directory:/path/to/backup/directory bwcli plugin backup save + docker exec -it -e BACKUP_DIRECTORY=/path/to/backup/directory bwcli plugin backup save + ``` + + ```bash + docker cp :/path/to/backup/directory /path/to/backup/directory ``` !!! note "Specifications for MariaDB/MySQL" @@ -762,7 +830,7 @@ You can also specify a custom directory for the backup by providing the `BACKUP_ ... ``` -### Manual restore +#### Manual restore To manually initiate a restore, execute the following command: @@ -791,7 +859,11 @@ You can also specify a custom backup file for the restore by providing the path === "Docker" ```bash - docker exec -it -v /path/to/backup/file:/path/to/backup/file bwcli plugin backup restore /path/to/backup/file + docker cp /path/to/backup/file :/path/to/backup/file + ``` + + ```bash + docker exec -it bwcli plugin backup restore /path/to/backup/file ``` !!! example "In case of failure" @@ -807,5 +879,291 @@ You can also specify a custom backup file for the restore by providing the path === "Docker" ```bash - docker exec -it -e BACKUP_DIRECTORY=/var/tmp/bunkerweb/backups -v /var/tmp/bunkerweb/backups:/var/tmp/bunkerweb/backups bwcli plugin backup restore + docker cp :/var/tmp/bunkerweb/backups /var/tmp/bunkerweb/backups ``` + + ```bash + docker exec -it -e BACKUP_DIRECTORY=/var/tmp/bunkerweb/backups bwcli plugin backup restore + ``` + +### Backup S3 crow pro icon (PRO) + +STREAM support :white_check_mark: + +The Backup S3 tool seamlessly automates data protection, similar to the community backup plugin. However, it stands out by securely storing backups directly in an S3 bucket. + +By activating this feature, you're proactively safeguarding your **data's integrity**. Storing backups **remotely** shields crucial information from threats like **hardware failures**, **cyberattacks**, or **natural disasters**. This ensures both **security** and **availability**, enabling swift recovery during **unexpected events**, preserving **operational continuity**, and ensuring **peace of mind**. + +!!! warning "Information for Red Hat Enterprise Linux (RHEL) 8.9 users" + If you are using **RHEL 8.9** and plan on using an **external database**, you will need to install the `mysql-community-client` package to ensure the `mysqldump` command is available. You can install the package by executing the following commands: + + === "MySQL/MariaDB" + + 1. **Install the MySQL repository configuration package** + + ```bash + sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm + ``` + + 2. **Enable the MySQL repository** + + ```bash + sudo dnf config-manager --enable mysql80-community + ``` + + 3. **Install the MySQL client** + + ```bash + sudo dnf install mysql-community-client + ``` + + === "PostgreSQL" + + 1. **Install the PostgreSQL repository configuration package** + + ```bash + dnf install "https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-$(uname -m)/pgdg-redhat-repo-latest.noarch.rpm" + ``` + + 2. **Install the PostgreSQL client** + + ```bash + dnf install postgresql + ``` + +**List of features** + +- Automatic data backup to an S3 bucket +- Flexible scheduling options: daily, weekly, or monthly +- Rotation management for controlling the number of backups to keep +- Customizable compression level for backup files + +**List of settings** + +| Setting | Default | Context | Description | +| ----------------------------- | ------- | ------- | ------------------------------------------------ | +| `USE_BACKUP_S3` | `no` | global | Enable or disable the S3 backup feature | +| `BACKUP_S3_SCHEDULE` | `daily` | global | Frequency of the backup (daily, weekly, monthly) | +| `BACKUP_S3_ROTATION` | `7` | global | Number of backups to keep | +| `BACKUP_S3_ENDPOINT` | | global | S3 endpoint | +| `BACKUP_S3_BUCKET` | | global | S3 bucket name | +| `BACKUP_S3_REGION` | | global | S3 region | +| `BACKUP_S3_ACCESS_KEY_ID` | | global | S3 access key ID | +| `BACKUP_S3_ACCESS_KEY_SECRET` | | global | S3 access key secret | +| `BACKUP_S3_COMP_LEVEL` | `6` | global | Compression level of the backup zip file (1-9) | + +#### Manual backup + +To manually initiate a backup, execute the following command: + +=== "Linux" + + ```bash + bwcli plugin backup_s3 save + ``` + +=== "Docker" + + ```bash + docker exec -it bwcli plugin backup_s3 save + ``` + +This command will create a backup of your database and store it in the S3 bucket specified in the `BACKUP_S3_BUCKET` setting. + +You can also specify a custom S3 bucket for the backup by providing the `BACKUP_S3_BUCKET` environment variable when executing the command: + +=== "Linux" + + ```bash + BACKUP_S3_BUCKET=your-bucket-name bwcli plugin backup_s3 save + ``` + +=== "Docker" + + ```bash + docker exec -it -e BACKUP_S3_BUCKET=your-bucket-name bwcli plugin backup_s3 save + ``` + +!!! note "Specifications for MariaDB/MySQL" + + In case you are using MariaDB/MySQL, you may encounter the following error when trying to backup your database: + + ```bash + caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so + ``` + + To resolve this issue, you can execute the following command to change the authentication plugin to `mysql_native_password`: + + ```sql + ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; + ``` + + If you're using the Docker integration, you can add the following command to the `docker-compose.yml` file to automatically change the authentication plugin: + + === "MariaDB" + + ```yaml + bw-db: + image: mariadb: + command: --default-authentication-plugin=mysql_native_password + ... + ``` + + === "MySQL" + + ```yaml + bw-db: + image: mysql: + command: --default-authentication-plugin=mysql_native_password + ... + ``` + +#### Manual restore + +To manually initiate a restore, execute the following command: + +=== "Linux" + + ```bash + bwcli plugin backup_s3 restore + ``` + +=== "Docker" + + ```bash + docker exec -it bwcli plugin backup_s3 restore + ``` + +This command will create a temporary backup of your database in the S3 bucket specified in the `BACKUP_S3_BUCKET` setting and restore your database to the latest backup available in the bucket. + +You can also specify a custom backup file for the restore by providing the path to it as an argument when executing the command: + +=== "Linux" + + ```bash + bwcli plugin backup_s3 restore s3_backup_file.zip + ``` + +=== "Docker" + + ```bash + docker exec -it bwcli plugin backup restore s3_backup_file.zip + ``` + +!!! example "In case of failure" + + Don't worry if the restore fails, you can always restore your database to the previous state by executing the command again as a backup is created before the restore: + + === "Linux" + + ```bash + bwcli plugin backup_s3 restore + ``` + + === "Docker" + + ```bash + docker exec -it bwcli plugin backup_s3 restore + ``` + +## Migration of BunkerWeb + +### Migration crow pro icon (PRO) + +STREAM support :white_check_mark: + +The Migration tool **revolutionizes** BunkerWeb configuration transfers between instances with its **user-friendly web interface**, simplifying the entire migration journey. Whether you're upgrading systems, scaling infrastructure, or transitioning environments, this tool empowers you to effortlessly transfer **settings, preferences, and data** with unmatched ease and confidence. Say goodbye to cumbersome manual processes and hello to a **seamless, hassle-free migration experience**. + +**List of features** + +- **Effortless Migration:** Easily transfer BunkerWeb configurations between instances without the complexities of manual procedures. + +- **Intuitive Web Interface:** Navigate through the migration process effortlessly with a user-friendly web interface designed for intuitive operation. + +- **Cross-Database Compatibility:** Enjoy seamless migration across various database platforms, including SQLite, MySQL, MariaDB, and PostgreSQL, ensuring compatibility with your preferred database environment. + +#### Create a migration file + +To manually create a migration file, execute the following command: + +=== "Linux" + + ```bash + bwcli plugin migration create /path/to/migration/file + ``` + +=== "Docker" + + 1. Create a migration file: + + ```bash + docker exec -it bwcli plugin migration create /path/to/migration/file + ``` + + 2. Copy the migration file to your local machine: + + ```bash + docker cp :/path/to/migration/file /path/to/migration/file + ``` + +This command will create a backup of your database and store it in the backup directory specified in the command. + +!!! note "Specifications for MariaDB/MySQL" + + In case you are using MariaDB/MySQL, you may encounter the following error when trying to backup your database: + + ```bash + caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so + ``` + + To resolve this issue, you can execute the following command to change the authentication plugin to `mysql_native_password`: + + ```sql + ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; + ``` + + If you're using the Docker integration, you can add the following command to the `docker-compose.yml` file to automatically change the authentication plugin: + + === "MariaDB" + + ```yaml + bw-db: + image: mariadb: + command: --default-authentication-plugin=mysql_native_password + ... + ``` + + === "MySQL" + + ```yaml + bw-db: + image: mysql: + command: --default-authentication-plugin=mysql_native_password + ... + ``` + +#### Initialize a migration + +To manually initialize a migration, execute the following command: + +=== "Linux" + + ```bash + bwcli plugin migration migrate /path/to/migration/file + ``` + +=== "Docker" + + 1. Copy the migration file to the container: + + ```bash + docker cp /path/to/migration/file :/path/to/migration/file + ``` + + 2. Initialize the migration: + + ```bash + docker exec -it bwcli plugin migration migrate /path/to/migration/file + ``` + +This command seamlessly migrates your BunkerWeb data to precisely match the configuration outlined in the migration file. diff --git a/docs/settings.md b/docs/settings.md index 02784093e..8e13116b9 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -15,41 +15,42 @@ When settings are considered as "multiple", it means that you can have multiple STREAM support :warning: -| Setting | Default | Context |Multiple| Description | -|------------------------------|------------------------------------------------------------------------------------------------------------------------|---------|--------|------------------------------------------------------------| -|`IS_LOADING` |`no` |global |no |Internal use : set to yes when BW is loading. | -|`NGINX_PREFIX` |`/etc/nginx/` |global |no |Where nginx will search for configurations. | -|`HTTP_PORT` |`8080` |global |no |HTTP port number which bunkerweb binds to. | -|`HTTPS_PORT` |`8443` |global |no |HTTPS port number which bunkerweb binds to. | -|`MULTISITE` |`no` |global |no |Multi site activation. | -|`SERVER_NAME` |`www.example.com` |multisite|no |List of the virtual hosts served by bunkerweb. | -|`WORKER_PROCESSES` |`auto` |global |no |Number of worker processes. | -|`WORKER_RLIMIT_NOFILE` |`2048` |global |no |Maximum number of open files for worker processes. | -|`WORKER_CONNECTIONS` |`1024` |global |no |Maximum number of connections per worker. | -|`LOG_FORMAT` |`$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"`|global |no |The format to use for access logs. | -|`LOG_LEVEL` |`notice` |global |no |The level to use for error logs. | -|`DNS_RESOLVERS` |`127.0.0.11` |global |no |DNS addresses of resolvers to use. | -|`DATASTORE_MEMORY_SIZE` |`64m` |global |no |Size of the internal datastore. | -|`CACHESTORE_MEMORY_SIZE` |`64m` |global |no |Size of the internal cachestore. | -|`CACHESTORE_IPC_MEMORY_SIZE` |`16m` |global |no |Size of the internal cachestore (ipc). | -|`CACHESTORE_MISS_MEMORY_SIZE` |`16m` |global |no |Size of the internal cachestore (miss). | -|`CACHESTORE_LOCKS_MEMORY_SIZE`|`16m` |global |no |Size of the internal cachestore (locks). | -|`USE_API` |`yes` |global |no |Activate the API to control BunkerWeb. | -|`API_HTTP_PORT` |`5000` |global |no |Listen port number for the API. | -|`API_LISTEN_IP` |`0.0.0.0` |global |no |Listen IP address for the API. | -|`API_SERVER_NAME` |`bwapi` |global |no |Server name (virtual host) for the API. | -|`API_WHITELIST_IP` |`127.0.0.0/8` |global |no |List of IP/network allowed to contact the API. | -|`AUTOCONF_MODE` |`no` |global |no |Enable Autoconf Docker integration. | -|`SWARM_MODE` |`no` |global |no |Enable Docker Swarm integration. | -|`KUBERNETES_MODE` |`no` |global |no |Enable Kubernetes integration. | -|`SERVER_TYPE` |`http` |multisite|no |Server type : http or stream. | -|`LISTEN_STREAM` |`yes` |multisite|no |Enable listening for non-ssl (passthrough). | -|`LISTEN_STREAM_PORT` |`1337` |multisite|no |Listening port for non-ssl (passthrough). | -|`LISTEN_STREAM_PORT_SSL` |`4242` |multisite|no |Listening port for ssl (passthrough). | -|`USE_UDP` |`no` |multisite|no |UDP listen instead of TCP (stream). | -|`USE_IPV6` |`no` |global |no |Enable IPv6 connectivity. | -|`IS_DRAFT` |`no` |multisite|no |Internal use : set to yes when the service is in draft mode.| -|`TIMERS_LOG_LEVEL` |`debug` |global |no |Log level for timers. | +| Setting | Default | Context |Multiple| Description | +|------------------------------|------------------------------------------------------------------------------------------------------------------------|---------|--------|--------------------------------------------------------------------------------------------| +|`IS_LOADING` |`no` |global |no |Internal use : set to yes when BW is loading. | +|`NGINX_PREFIX` |`/etc/nginx/` |global |no |Where nginx will search for configurations. | +|`HTTP_PORT` |`8080` |global |no |HTTP port number which bunkerweb binds to. | +|`HTTPS_PORT` |`8443` |global |no |HTTPS port number which bunkerweb binds to. | +|`MULTISITE` |`no` |global |no |Multi site activation. | +|`SERVER_NAME` |`www.example.com` |multisite|no |List of the virtual hosts served by bunkerweb. | +|`WORKER_PROCESSES` |`auto` |global |no |Number of worker processes. | +|`WORKER_RLIMIT_NOFILE` |`2048` |global |no |Maximum number of open files for worker processes. | +|`WORKER_CONNECTIONS` |`1024` |global |no |Maximum number of connections per worker. | +|`LOG_FORMAT` |`$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"`|global |no |The format to use for access logs. | +|`LOG_LEVEL` |`notice` |global |no |The level to use for error logs. | +|`DNS_RESOLVERS` |`127.0.0.11` |global |no |DNS addresses of resolvers to use. | +|`DATASTORE_MEMORY_SIZE` |`64m` |global |no |Size of the internal datastore. | +|`CACHESTORE_MEMORY_SIZE` |`64m` |global |no |Size of the internal cachestore. | +|`CACHESTORE_IPC_MEMORY_SIZE` |`16m` |global |no |Size of the internal cachestore (ipc). | +|`CACHESTORE_MISS_MEMORY_SIZE` |`16m` |global |no |Size of the internal cachestore (miss). | +|`CACHESTORE_LOCKS_MEMORY_SIZE`|`16m` |global |no |Size of the internal cachestore (locks). | +|`USE_API` |`yes` |global |no |Activate the API to control BunkerWeb. | +|`API_HTTP_PORT` |`5000` |global |no |Listen port number for the API. | +|`API_LISTEN_IP` |`0.0.0.0` |global |no |Listen IP address for the API. | +|`API_SERVER_NAME` |`bwapi` |global |no |Server name (virtual host) for the API. | +|`API_WHITELIST_IP` |`127.0.0.0/8` |global |no |List of IP/network allowed to contact the API. | +|`AUTOCONF_MODE` |`no` |global |no |Enable Autoconf Docker integration. | +|`SWARM_MODE` |`no` |global |no |Enable Docker Swarm integration. | +|`KUBERNETES_MODE` |`no` |global |no |Enable Kubernetes integration. | +|`SERVER_TYPE` |`http` |multisite|no |Server type : http or stream. | +|`LISTEN_STREAM` |`yes` |multisite|no |Enable listening for non-ssl (passthrough). | +|`LISTEN_STREAM_PORT` |`1337` |multisite|no |Listening port for non-ssl (passthrough). | +|`LISTEN_STREAM_PORT_SSL` |`4242` |multisite|no |Listening port for ssl (passthrough). | +|`USE_UDP` |`no` |multisite|no |UDP listen instead of TCP (stream). | +|`USE_IPV6` |`no` |global |no |Enable IPv6 connectivity. | +|`IS_DRAFT` |`no` |multisite|no |Internal use : set to yes when the service is in draft mode. | +|`TIMERS_LOG_LEVEL` |`debug` |global |no |Log level for timers. | +|`OVERRIDE_INSTANCES` | |global |no |List of BunkerWeb instances separated with spaces (format : fqdn-or-ip:5000 fqdn-or-ip:5000)| ## Antibot diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 9f1ee4e16..66c638ee7 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -470,3 +470,10 @@ In case you lost your UI credentials or have 2FA issues, you can connect to the ``` You should now be able to log into the web UI only using your username and password. + +**Upload plugin** + +It may not be possible to upload a plugin from the UI in certain situations: + +- Missing package to manage compressed files on your integration, in which case you will need to add the necessary packages +- Safari browser : the 'safe mode' may prevent you from being able to add a plugin. You will need to make the necessary changes on your machine diff --git a/docs/upgrading.md b/docs/upgrading.md index 6682c8d3e..24f7b4d15 100644 --- a/docs/upgrading.md +++ b/docs/upgrading.md @@ -17,7 +17,11 @@ === "Docker" ```bash - docker exec -it -e BACKUP_DIRECTORY=/path/to/backup/directory -v /path/to/backup/directory:/path/to/backup/directory bwcli plugin backup save + docker exec -it -e BACKUP_DIRECTORY=/path/to/backup/directory bwcli plugin backup save + ``` + + ```bash + docker cp :/path/to/backup/directory /path/to/backup/directory ``` === "Linux" @@ -47,13 +51,13 @@ === "PostgreSQL" - 1. **Install the PostgreSQL repository configuration package** + 4. **Install the PostgreSQL repository configuration package** ```bash dnf install "https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-$(uname -m)/pgdg-redhat-repo-latest.noarch.rpm" ``` - 2. **Install the PostgreSQL client** + 5. **Install the PostgreSQL client** ```bash dnf install postgresql @@ -145,13 +149,13 @@ === "Linux" - 1. **Stop the services**: + 3. **Stop the services**: ```bash systemctl stop bunkerweb-scheduler systemctl stop bunkerweb-ui ``` - 2. **Update BunkerWeb**: + 4. **Update BunkerWeb**: - Update BunkerWeb to the latest version by following the instructions in the [integration Linux page](integrations.md#linux). diff --git a/docs/web-ui.md b/docs/web-ui.md index a03266ec7..0f5f2d305 100644 --- a/docs/web-ui.md +++ b/docs/web-ui.md @@ -855,6 +855,7 @@ After a successful login/password combination, you will be prompted to enter you - www.example.com_REVERSE_PROXY_URL=/changeme - www.example.com_REVERSE_PROXY_HOST=http://bw-ui:7000 - www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 + - www.example.com_MAX_CLIENT_SIZE=50m networks: - bw-universe - bw-services @@ -1040,7 +1041,7 @@ After a successful login/password combination, you will be prompted to enter you - "bunkerweb.REVERSE_PROXY_URL=/changeme" - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000" - "bunkerweb.INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504" - + - "bunkerweb.MAX_CLIENT_SIZE=50m" volumes: bw-data: @@ -1195,7 +1196,7 @@ After a successful login/password combination, you will be prompted to enter you - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000" - "bunkerweb.REVERSE_PROXY_INTERCEPT_ERRORS=no" - "bunkerweb.INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504" - + - "bunkerweb.MAX_CLIENT_SIZE=50m" volumes: bw-data: @@ -1549,6 +1550,7 @@ After a successful login/password combination, you will be prompted to enter you annotations: bunkerweb.io/www.example.com_USE_UI: "yes" bunkerweb.io/www.example.com_INTERCEPTED_ERROR_CODES: '400 404 405 413 429 500 501 502 503 504' + bunkerweb.io/www.example.com_MAX_CLIENT_SIZE: '50m' spec: rules: - host: www.example.com @@ -1602,6 +1604,7 @@ After a successful login/password combination, you will be prompted to enter you www.example.com_REVERSE_PROXY_URL=/changeme www.example.com_REVERSE_PROXY_HOST=http://127.0.0.1:7000 www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 + www.example.com_MAX_CLIENT_SIZE=50m ``` Don't forget to restart the `bunkerweb` service : @@ -1635,6 +1638,7 @@ After a successful login/password combination, you will be prompted to enter you www.example.com_REVERSE_PROXY_URL=/changeme www.example.com_REVERSE_PROXY_HOST=http://127.0.0.1:7000 www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 + www.example.com_MAX_CLIENT_SIZE=50m ``` The variable `enable_ui` can be set to `true` in order to activate the web UI service and the variable `custom_ui` can be used to specify the configuration file for the web UI : @@ -1709,6 +1713,7 @@ After a successful login/password combination, you will be prompted to enter you www.example.com_REVERSE_PROXY_URL=/changeme www.example.com_REVERSE_PROXY_HOST=http://127.0.0.1:7000 www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 + www.example.com_MAX_CLIENT_SIZE=50m ``` Don't forget to restart the `bunkerweb` service : diff --git a/examples/web-ui/docker-compose.yml b/examples/web-ui/docker-compose.yml index a3d5fff69..82446cacc 100644 --- a/examples/web-ui/docker-compose.yml +++ b/examples/web-ui/docker-compose.yml @@ -22,6 +22,7 @@ services: - www.example.com_REVERSE_PROXY_URL=/changeme - www.example.com_REVERSE_PROXY_HOST=http://bw-ui:7000 - www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 + - www.example.com_MAX_CLIENT_SIZE=50m networks: - bw-universe - bw-services diff --git a/misc/dev/variables.ui.env b/misc/dev/variables.ui.env index 528ed4494..aa1e2ceb3 100644 --- a/misc/dev/variables.ui.env +++ b/misc/dev/variables.ui.env @@ -15,5 +15,5 @@ USE_GZIP=yes www.example.com_USE_UI=yes www.example.com_USE_REVERSE_PROXY=yes www.example.com_REVERSE_PROXY_URL=/admin -www.example.com_REVERSE_PROXY_HOST=http://bw-ui:7000 +www.example.com_REVERSE_PROXY_HOST=http://127.0.0.1:7000 www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 diff --git a/misc/dev/variables.ui copy.env b/misc/dev/variables.ui.misc.env similarity index 91% rename from misc/dev/variables.ui copy.env rename to misc/dev/variables.ui.misc.env index 5f25cedb1..e1daac0a2 100644 --- a/misc/dev/variables.ui copy.env +++ b/misc/dev/variables.ui.misc.env @@ -16,6 +16,6 @@ USE_GZIP=yes www.example.com_USE_UI=yes www.example.com_USE_REVERSE_PROXY=yes www.example.com_REVERSE_PROXY_URL=/admin -www.example.com_REVERSE_PROXY_HOST=http://bw-ui:7000 +www.example.com_REVERSE_PROXY_HOST=http://127.0.0.1:7000 www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 EXTERNAL_PLUGIN_URLS=https://github.com/bunkerity/bunkerweb-plugins/archive/refs/heads/dev.zip diff --git a/misc/integrations/autoconf.mariadb.ui.yml b/misc/integrations/autoconf.mariadb.ui.yml index cc8786012..bf08b240f 100644 --- a/misc/integrations/autoconf.mariadb.ui.yml +++ b/misc/integrations/autoconf.mariadb.ui.yml @@ -86,6 +86,7 @@ services: - "bunkerweb.REVERSE_PROXY_URL=/changeme" - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000" - "bunkerweb.INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504" + - "bunkerweb.MAX_CLIENT_SIZE=50m" volumes: bw-data: diff --git a/misc/integrations/autoconf.mysql.ui.yml b/misc/integrations/autoconf.mysql.ui.yml index 4d1981be4..6eeb4fdd9 100644 --- a/misc/integrations/autoconf.mysql.ui.yml +++ b/misc/integrations/autoconf.mysql.ui.yml @@ -86,6 +86,7 @@ services: - "bunkerweb.REVERSE_PROXY_URL=/changeme" - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000" - "bunkerweb.INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504" + - "bunkerweb.MAX_CLIENT_SIZE=50m" volumes: bw-data: diff --git a/misc/integrations/autoconf.postgres.ui.yml b/misc/integrations/autoconf.postgres.ui.yml index ca93c5371..42b969a56 100644 --- a/misc/integrations/autoconf.postgres.ui.yml +++ b/misc/integrations/autoconf.postgres.ui.yml @@ -85,6 +85,7 @@ services: - "bunkerweb.REVERSE_PROXY_URL=/changeme" - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000" - "bunkerweb.INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504" + - "bunkerweb.MAX_CLIENT_SIZE=50m" volumes: bw-data: diff --git a/misc/integrations/autoconf.ui.yml b/misc/integrations/autoconf.ui.yml index b26dca719..f03e2f6ed 100644 --- a/misc/integrations/autoconf.ui.yml +++ b/misc/integrations/autoconf.ui.yml @@ -76,6 +76,7 @@ services: - "bunkerweb.REVERSE_PROXY_URL=/changeme" - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000" - "bunkerweb.INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504" + - "bunkerweb.MAX_CLIENT_SIZE=50m" volumes: bw-data: diff --git a/misc/integrations/docker.mariadb.ui.yml b/misc/integrations/docker.mariadb.ui.yml index 3b3223321..27867ccb6 100644 --- a/misc/integrations/docker.mariadb.ui.yml +++ b/misc/integrations/docker.mariadb.ui.yml @@ -21,6 +21,7 @@ services: - www.example.com_REVERSE_PROXY_URL=/changeme - www.example.com_REVERSE_PROXY_HOST=http://bw-ui:7000 - www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 + - www.example.com_MAX_CLIENT_SIZE=50m networks: - bw-universe - bw-services diff --git a/misc/integrations/docker.mysql.ui.yml b/misc/integrations/docker.mysql.ui.yml index 0e06b1f1e..4cd025d1d 100644 --- a/misc/integrations/docker.mysql.ui.yml +++ b/misc/integrations/docker.mysql.ui.yml @@ -21,6 +21,7 @@ services: - www.example.com_REVERSE_PROXY_URL=/changeme - www.example.com_REVERSE_PROXY_HOST=http://bw-ui:7000 - www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 + - www.example.com_MAX_CLIENT_SIZE=50m networks: - bw-universe - bw-services diff --git a/misc/integrations/docker.postgres.ui.yml b/misc/integrations/docker.postgres.ui.yml index 94b56f7e3..0ebbb1ebc 100644 --- a/misc/integrations/docker.postgres.ui.yml +++ b/misc/integrations/docker.postgres.ui.yml @@ -22,6 +22,7 @@ services: - www.example.com_REVERSE_PROXY_URL=/changeme - www.example.com_REVERSE_PROXY_HOST=http://bw-ui:7000 - www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 + - www.example.com_MAX_CLIENT_SIZE=50m networks: - bw-universe - bw-services diff --git a/misc/integrations/docker.ui.yml b/misc/integrations/docker.ui.yml index 2fd1d5f1f..36447dbc3 100644 --- a/misc/integrations/docker.ui.yml +++ b/misc/integrations/docker.ui.yml @@ -17,6 +17,7 @@ services: - www.example.com_REVERSE_PROXY_URL=/changeme - www.example.com_REVERSE_PROXY_HOST=http://bw-ui:7000 - www.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504 + - www.example.com_MAX_CLIENT_SIZE=50m networks: - bw-universe - bw-services diff --git a/misc/integrations/k8s.mariadb.ui.yml b/misc/integrations/k8s.mariadb.ui.yml index 64c51e5eb..8619ed262 100644 --- a/misc/integrations/k8s.mariadb.ui.yml +++ b/misc/integrations/k8s.mariadb.ui.yml @@ -312,6 +312,7 @@ metadata: annotations: bunkerweb.io/www.example.com_USE_UI: "yes" bunkerweb.io/www.example.com_INTERCEPTED_ERROR_CODES: "400 404 405 413 429 500 501 502 503 504" + bunkerweb.io/www.example.com_MAX_CLIENT_SIZE: "50m" spec: rules: - host: www.example.com diff --git a/misc/integrations/k8s.mysql.ui.yml b/misc/integrations/k8s.mysql.ui.yml index 763b4aacd..ea36bf17a 100644 --- a/misc/integrations/k8s.mysql.ui.yml +++ b/misc/integrations/k8s.mysql.ui.yml @@ -311,6 +311,7 @@ metadata: annotations: bunkerweb.io/www.example.com_USE_UI: "yes" bunkerweb.io/www.example.com_INTERCEPTED_ERROR_CODES: "400 404 405 413 429 500 501 502 503 504" + bunkerweb.io/www.example.com_MAX_CLIENT_SIZE: "50m" spec: rules: - host: www.example.com diff --git a/misc/integrations/k8s.postgres.ui.yml b/misc/integrations/k8s.postgres.ui.yml index 8a79f9157..6ee9735f6 100644 --- a/misc/integrations/k8s.postgres.ui.yml +++ b/misc/integrations/k8s.postgres.ui.yml @@ -311,6 +311,7 @@ metadata: annotations: bunkerweb.io/www.example.com_USE_UI: "yes" bunkerweb.io/www.example.com_INTERCEPTED_ERROR_CODES: "400 404 405 413 429 500 501 502 503 504" + bunkerweb.io/www.example.com_MAX_CLIENT_SIZE: "50m" spec: rules: - host: www.example.com diff --git a/misc/integrations/swarm.mariadb.ui.yml b/misc/integrations/swarm.mariadb.ui.yml index b2aff43a1..2e71c823b 100644 --- a/misc/integrations/swarm.mariadb.ui.yml +++ b/misc/integrations/swarm.mariadb.ui.yml @@ -104,6 +104,7 @@ services: - "bunkerweb.REVERSE_PROXY_URL=/changeme" - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000" - "bunkerweb.INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504" + - "bunkerweb.MAX_CLIENT_SIZE=50m" volumes: bw-data: diff --git a/misc/integrations/swarm.mysql.ui.yml b/misc/integrations/swarm.mysql.ui.yml index d7d21a462..8b254f39e 100644 --- a/misc/integrations/swarm.mysql.ui.yml +++ b/misc/integrations/swarm.mysql.ui.yml @@ -104,6 +104,7 @@ services: - "bunkerweb.REVERSE_PROXY_URL=/changeme" - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000" - "bunkerweb.INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504" + - "bunkerweb.MAX_CLIENT_SIZE=50m" volumes: bw-data: diff --git a/misc/integrations/swarm.postgres.ui.yml b/misc/integrations/swarm.postgres.ui.yml index cfd397233..e3e2f4026 100644 --- a/misc/integrations/swarm.postgres.ui.yml +++ b/misc/integrations/swarm.postgres.ui.yml @@ -103,6 +103,7 @@ services: - "bunkerweb.REVERSE_PROXY_URL=/changeme" - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000" - "bunkerweb.INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504" + - "bunkerweb.MAX_CLIENT_SIZE=50m" volumes: bw-data: diff --git a/src/common/core/antibot/ui/template.html b/src/common/core/antibot/ui/template.html index 3e931e9bc..da6ef8b44 100644 --- a/src/common/core/antibot/ui/template.html +++ b/src/common/core/antibot/ui/template.html @@ -10,25 +10,24 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
- - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} - {% for key, value in pre_render["data"].items() %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/backup/ui/template.html b/src/common/core/backup/ui/template.html index 14c762ad9..d759ef66d 100644 --- a/src/common/core/backup/ui/template.html +++ b/src/common/core/backup/ui/template.html @@ -10,22 +10,22 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

- {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
LAST BACKUP
diff --git a/src/common/core/badbehavior/ui/template.html b/src/common/core/badbehavior/ui/template.html index 73306f477..9c5a8a118 100644 --- a/src/common/core/badbehavior/ui/template.html +++ b/src/common/core/badbehavior/ui/template.html @@ -10,32 +10,32 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available - +

More information available + in the documentation .

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/blacklist/ui/template.html b/src/common/core/blacklist/ui/template.html index 20515c792..fa9ea0222 100644 --- a/src/common/core/blacklist/ui/template.html +++ b/src/common/core/blacklist/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} +
- - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/bunkernet/ui/template.html b/src/common/core/bunkernet/ui/template.html index 99cab94cb..d71641578 100644 --- a/src/common/core/bunkernet/ui/template.html +++ b/src/common/core/bunkernet/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/cors/ui/template.html b/src/common/core/cors/ui/template.html index 54247be39..96f4089a5 100644 --- a/src/common/core/cors/ui/template.html +++ b/src/common/core/cors/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/country/ui/template.html b/src/common/core/country/ui/template.html index 6dbdee9c7..fe9436287 100644 --- a/src/common/core/country/ui/template.html +++ b/src/common/core/country/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/dnsbl/ui/template.html b/src/common/core/dnsbl/ui/template.html index e8227ef62..75dcfcf8f 100644 --- a/src/common/core/dnsbl/ui/template.html +++ b/src/common/core/dnsbl/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/errors/ui/template.html b/src/common/core/errors/ui/template.html index 0dfd5cc72..54b5f937b 100644 --- a/src/common/core/errors/ui/template.html +++ b/src/common/core/errors/ui/template.html @@ -9,27 +9,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/greylist/ui/template.html b/src/common/core/greylist/ui/template.html index 96fc3e820..b693e214a 100644 --- a/src/common/core/greylist/ui/template.html +++ b/src/common/core/greylist/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/limit/ui/template.html b/src/common/core/limit/ui/template.html index 2b3250985..99b8dc583 100644 --- a/src/common/core/limit/ui/template.html +++ b/src/common/core/limit/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/misc/ui/template.html b/src/common/core/misc/ui/template.html index 75bfe92a3..885299ed9 100644 --- a/src/common/core/misc/ui/template.html +++ b/src/common/core/misc/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} +
- - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/pro/jobs/download-pro-plugins.py b/src/common/core/pro/jobs/download-pro-plugins.py index 63bc6240a..698882f51 100644 --- a/src/common/core/pro/jobs/download-pro-plugins.py +++ b/src/common/core/pro/jobs/download-pro-plugins.py @@ -96,6 +96,7 @@ def install_plugin(plugin_path: Path, db, preview: bool = True) -> bool: try: db = Database(LOGGER, sqlalchemy_string=getenv("DATABASE_URI")) db_metadata = db.get_metadata() + db_config = db.get_config() current_date = datetime.now() pro_license_key = getenv("PRO_LICENSE_KEY", "").strip() @@ -157,7 +158,8 @@ try: # ? If we already checked today, skip the check and if the metadata is the same, skip the check if ( - metadata.get("is_pro", False) == db_metadata["is_pro"] + pro_license_key == db_config["PRO_LICENSE_KEY"] + and metadata.get("is_pro", False) == db_metadata["is_pro"] and db_metadata["last_pro_check"] and current_date.replace(hour=0, minute=0, second=0, microsecond=0) == db_metadata["last_pro_check"].replace(hour=0, minute=0, second=0, microsecond=0) ): diff --git a/src/common/core/redis/ui/template.html b/src/common/core/redis/ui/template.html index 4773a2b6a..77a36e8fd 100644 --- a/src/common/core/redis/ui/template.html +++ b/src/common/core/redis/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/reversescan/ui/template.html b/src/common/core/reversescan/ui/template.html index 55838e3f9..0ee31c262 100644 --- a/src/common/core/reversescan/ui/template.html +++ b/src/common/core/reversescan/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/core/whitelist/ui/template.html b/src/common/core/whitelist/ui/template.html index 6a05291e3..3ea0ddd84 100644 --- a/src/common/core/whitelist/ui/template.html +++ b/src/common/core/whitelist/ui/template.html @@ -10,27 +10,27 @@
INFO
-

{{plugin.get('description')}}

+

{{plugin.get('description')}}

-

More information available in the documentation.

+

More information available in the documentation.

-
+ - {% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %}
-

(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}

+

(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}

{% endif %} - {% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %} + {% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %} - {% for key, value in pre_render["data"].items() %} + {% for key, value in pre_render.get("data", {}).items() %} {% if key.startswith("ping_") %}
diff --git a/src/common/db/Database.py b/src/common/db/Database.py index bf90671a3..54d63db78 100644 --- a/src/common/db/Database.py +++ b/src/common/db/Database.py @@ -3,17 +3,17 @@ from contextlib import contextmanager, suppress from copy import deepcopy from datetime import datetime -from hashlib import sha256 -from inspect import getsourcefile +from io import BytesIO from logging import Logger from os import _exit, getenv, listdir, sep -from os.path import basename, join +from os.path import join from pathlib import Path from re import compile as re_compile -from sys import _getframe, path as sys_path +from sys import argv, path as sys_path from typing import Any, Dict, List, Literal, Optional, Tuple, Union from time import sleep from traceback import format_exc +from zipfile import ZIP_DEFLATED, ZipFile from model import ( Base, @@ -37,7 +37,7 @@ for deps_path in [join(sep, "usr", "share", "bunkerweb", *paths) for paths in (( if deps_path not in sys_path: sys_path.append(deps_path) -from common_utils import file_hash # type: ignore +from common_utils import bytes_hash # type: ignore from pymysql import install_as_MySQLdb from sqlalchemy import create_engine, event, MetaData as sql_metadata, text, inspect @@ -717,6 +717,7 @@ class Database: .with_entities( Plugin_pages.template_checksum, Plugin_pages.actions_checksum, + Plugin_pages.obfuscation_checksum, ) .filter_by(plugin_id=plugin["id"]) .first() @@ -728,8 +729,21 @@ class Database: if {"template.html", "actions.py"}.issubset(listdir(str(path_ui))): template = path_ui.joinpath("template.html").read_bytes() actions = path_ui.joinpath("actions.py").read_bytes() - template_checksum = sha256(template).hexdigest() - actions_checksum = sha256(actions).hexdigest() + template_checksum = bytes_hash(template, algorithm="sha256") + actions_checksum = bytes_hash(actions, algorithm="sha256") + + obfuscation_file = None + obfuscation_checksum = None + obfuscation_dir = path_ui.joinpath("pyarmor_runtime_000000") + if obfuscation_dir.is_dir(): + obfuscation_file = BytesIO() + with ZipFile(obfuscation_file, "w", ZIP_DEFLATED) as zip_file: + for path in obfuscation_dir.rglob("*"): + if path.is_file(): + zip_file.write(path, path.relative_to(path_ui)) + obfuscation_file.seek(0, 0) + obfuscation_file = obfuscation_file.getvalue() + obfuscation_checksum = bytes_hash(obfuscation_file, algorithm="sha256") if db_plugin_page: updates = {} @@ -749,6 +763,14 @@ class Database: } ) + if obfuscation_checksum != db_plugin_page.obfuscation_checksum: + updates.update( + { + Plugin_pages.obfuscation_file: obfuscation_file, + Plugin_pages.obfuscation_checksum: obfuscation_checksum, + } + ) + if updates: self.logger.warning(f'Page for plugin "{plugin["id"]}" already exists, updating it with the new values') session.query(Plugin_pages).filter(Plugin_pages.plugin_id == plugin["id"]).update(updates) @@ -764,6 +786,8 @@ class Database: template_checksum=template_checksum, actions_file=actions, actions_checksum=actions_checksum, + obfuscation_file=obfuscation_file, + obfuscation_checksum=obfuscation_checksum, ) ) remove = False @@ -1103,7 +1127,7 @@ class Database: custom_config["type"] = custom_config["type"].replace("-", "_").lower() # type: ignore custom_config["data"] = custom_config["data"].encode("utf-8") if isinstance(custom_config["data"], str) else custom_config["data"] - custom_config["checksum"] = sha256(custom_config["data"]).hexdigest() # type: ignore + custom_config["checksum"] = bytes_hash(custom_config["data"], algorithm="sha256") # type: ignore service_id = custom_config.get("service_id", None) or None filters = { @@ -1292,7 +1316,7 @@ class Database: return "" def delete_job_cache(self, file_name: str, *, job_name: Optional[str] = None, service_id: Optional[str] = None): - job_name = job_name or basename(getsourcefile(_getframe(1))).replace(".py", "") + job_name = job_name or argv[0].replace(".py", "") filters = {"file_name": file_name} if job_name: filters["job_name"] = job_name @@ -1312,7 +1336,7 @@ class Database: checksum: Optional[str] = None, ) -> str: """Update the plugin cache in the database""" - job_name = job_name or basename(getsourcefile(_getframe(1))).replace(".py", "") + job_name = job_name or argv[0].replace(".py", "") service_id = service_id or None with self.__db_session() as session: cache = session.query(Jobs_cache).filter_by(job_name=job_name, service_id=service_id, file_name=file_name).first() @@ -1578,6 +1602,7 @@ class Database: .with_entities( Plugin_pages.template_checksum, Plugin_pages.actions_checksum, + Plugin_pages.obfuscation_checksum, ) .filter_by(plugin_id=plugin["id"]) .first() @@ -1587,32 +1612,46 @@ class Database: if path_ui.is_dir(): remove = True if {"template.html", "actions.py"}.issubset(listdir(str(path_ui))): + template = path_ui.joinpath("template.html").read_bytes() + actions = path_ui.joinpath("actions.py").read_bytes() + template_checksum = bytes_hash(template, algorithm="sha256") + actions_checksum = bytes_hash(actions, algorithm="sha256") + + obfuscation_file = None + obfuscation_checksum = None + obfuscation_dir = path_ui.joinpath("pyarmor_runtime_000000") + if obfuscation_dir.is_dir(): + obfuscation_file = BytesIO() + with ZipFile(obfuscation_file, "w", ZIP_DEFLATED) as zip_file: + for path in obfuscation_dir.rglob("*"): + if path.is_file(): + zip_file.write(path, path.relative_to(path_ui)) + obfuscation_file.seek(0, 0) + obfuscation_file = obfuscation_file.getvalue() + obfuscation_checksum = bytes_hash(obfuscation_file, algorithm="sha256") + if not db_plugin_page: changes = True - template = path_ui.joinpath("template.html").read_bytes() - actions = path_ui.joinpath("actions.py").read_bytes() to_put.append( Plugin_pages( plugin_id=plugin["id"], template_file=template, - template_checksum=sha256(template).hexdigest(), + template_checksum=template_checksum, actions_file=actions, - actions_checksum=sha256(actions).hexdigest(), + actions_checksum=actions_checksum, + obfuscation_file=obfuscation_file, + obfuscation_checksum=obfuscation_checksum, ) ) remove = False else: updates = {} - template_path = path_ui.joinpath("template.html") - actions_path = path_ui.joinpath("actions.py") - template_checksum = file_hash(str(template_path)) - actions_checksum = file_hash(str(actions_path)) if template_checksum != db_plugin_page.template_checksum: updates.update( { - Plugin_pages.template_file: template_path.read_bytes(), + Plugin_pages.template_file: template, Plugin_pages.template_checksum: template_checksum, } ) @@ -1620,11 +1659,19 @@ class Database: if actions_checksum != db_plugin_page.actions_checksum: updates.update( { - Plugin_pages.actions_file: actions_path.read_bytes(), + Plugin_pages.actions_file: actions, Plugin_pages.actions_checksum: actions_checksum, } ) + if obfuscation_checksum != db_plugin_page.obfuscation_checksum: + updates.update( + { + Plugin_pages.obfuscation_file: obfuscation_file, + Plugin_pages.obfuscation_checksum: obfuscation_checksum, + } + ) + if updates: changes = True session.query(Plugin_pages).filter(Plugin_pages.plugin_id == plugin["id"]).update(updates) @@ -1732,35 +1779,49 @@ class Database: .with_entities( Plugin_pages.template_checksum, Plugin_pages.actions_checksum, + Plugin_pages.obfuscation_checksum, ) .filter_by(plugin_id=plugin["id"]) .first() ) + template = path_ui.joinpath("template.html").read_bytes() + actions = path_ui.joinpath("actions.py").read_bytes() + template_checksum = bytes_hash(template, algorithm="sha256") + actions_checksum = bytes_hash(actions, algorithm="sha256") + + obfuscation_file = None + obfuscation_checksum = None + obfuscation_dir = path_ui.joinpath("pyarmor_runtime_000000") + if obfuscation_dir.is_dir(): + obfuscation_file = BytesIO() + with ZipFile(obfuscation_file, "w", ZIP_DEFLATED) as zip_file: + for path in obfuscation_dir.rglob("*"): + if path.is_file(): + zip_file.write(path, path.relative_to(path_ui)) + obfuscation_file.seek(0, 0) + obfuscation_file = obfuscation_file.getvalue() + obfuscation_checksum = bytes_hash(obfuscation_file, algorithm="sha256") if not db_plugin_page: - template = path_ui.joinpath("template.html").read_bytes() - actions = path_ui.joinpath("actions.py").read_bytes() to_put.append( Plugin_pages( plugin_id=plugin["id"], template_file=template, - template_checksum=sha256(template).hexdigest(), + template_checksum=template_checksum, actions_file=actions, - actions_checksum=sha256(actions).hexdigest(), + actions_checksum=actions_checksum, + obfuscation_file=obfuscation_file, + obfuscation_checksum=obfuscation_checksum, ) ) else: updates = {} - template_path = path_ui.joinpath("template.html") - actions_path = path_ui.joinpath("actions.py") - template_checksum = file_hash(str(template_path)) - actions_checksum = file_hash(str(actions_path)) if template_checksum != db_plugin_page.template_checksum: updates.update( { - Plugin_pages.template_file: template_path.read_bytes(), + Plugin_pages.template_file: template, Plugin_pages.template_checksum: template_checksum, } ) @@ -1768,15 +1829,23 @@ class Database: if actions_checksum != db_plugin_page.actions_checksum: updates.update( { - Plugin_pages.actions_file: actions_path.read_bytes(), + Plugin_pages.actions_file: actions, Plugin_pages.actions_checksum: actions_checksum, } ) + if obfuscation_checksum != db_plugin_page.obfuscation_checksum: + updates.update( + { + Plugin_pages.obfuscation_file: obfuscation_file, + Plugin_pages.obfuscation_checksum: obfuscation_checksum, + } + ) + if updates: session.query(Plugin_pages).filter(Plugin_pages.plugin_id == plugin["id"]).update(updates) - for command, file_name in plugin.get("bwcli", {}).items(): + for command, file_name in commands.items(): if not plugin_path.joinpath("bwcli", file_name).is_file(): self.logger.warning(f'Command "{command}"\'s file "{file_name}" does not exist in the plugin directory, skipping it') continue @@ -1806,7 +1875,7 @@ class Database: with self.__db_session() as session: entities = [Plugins.id, Plugins.stream, Plugins.name, Plugins.description, Plugins.version, Plugins.type, Plugins.method, Plugins.checksum] if with_data: - entities.append(Plugins.data) + entities.append(Plugins.data) # type: ignore db_plugins = session.query(Plugins).with_entities(*entities) if _type != "all": @@ -1876,6 +1945,7 @@ class Database: with self.__db_session() as session: return { job.name: { + "plugin_id": job.plugin_id, "every": job.every, "reload": job.reload, "success": job.success, @@ -1898,6 +1968,7 @@ class Database: for job in ( session.query(Jobs).with_entities( Jobs.name, + Jobs.plugin_id, Jobs.every, Jobs.reload, Jobs.success, @@ -2069,6 +2140,16 @@ class Database: return page.template_file + def get_plugin_obfuscation(self, plugin: str) -> Optional[Any]: + """get obfuscation file for the plugin""" + with self.__db_session() as session: + page = session.query(Plugin_pages).with_entities(Plugin_pages.obfuscation_file).filter_by(plugin_id=plugin).first() + + if not page: + return None + + return page.obfuscation_file + def get_ui_user(self) -> Optional[dict]: """Get ui user.""" with self.__db_session() as session: diff --git a/src/common/db/model.py b/src/common/db/model.py index bb0bf1fa3..c4325224b 100644 --- a/src/common/db/model.py +++ b/src/common/db/model.py @@ -150,6 +150,8 @@ class Plugin_pages(Base): template_checksum = Column(String(128), nullable=False) actions_file = Column(LargeBinary(length=(2**32) - 1), nullable=False) actions_checksum = Column(String(128), nullable=False) + obfuscation_file = Column(LargeBinary(length=(2**32) - 1), default=None, nullable=True) + obfuscation_checksum = Column(String(128), default=None, nullable=True) plugin = relationship("Plugins", back_populates="pages") diff --git a/src/deps/deps.json b/src/deps/deps.json index a93c73bc9..1054839bd 100644 --- a/src/deps/deps.json +++ b/src/deps/deps.json @@ -151,9 +151,9 @@ }, { "id": "lua-resty-openssl", - "name": "lua-resty-openssl v1.2.1", + "name": "lua-resty-openssl v1.3.0", "url": "https://github.com/fffonion/lua-resty-openssl.git", - "commit": "58c6ce6885556ed7cb85dde83d673fad05ba73aa", + "commit": "79b9c2f787febd03b9741ef9fad084a39a888d7c", "post_install": "rm -r src/deps/src/lua-resty-openssl/t" }, { diff --git a/src/deps/src/lua-resty-openssl/.github/workflows/tests.yml b/src/deps/src/lua-resty-openssl/.github/workflows/tests.yml index 2513bdda5..27529bfaf 100644 --- a/src/deps/src/lua-resty-openssl/.github/workflows/tests.yml +++ b/src/deps/src/lua-resty-openssl/.github/workflows/tests.yml @@ -29,14 +29,14 @@ jobs: # TODO: arm64 # latest and one version older for valgrind and perf test - nginx: "1.19.9" - openssl: "3.1.4" + openssl: "3.1.5" openssl_fips: "3.0.8" extras: "valgrind" lua_nginx_module: "v0.10.20" lua_resty_core: "v0.1.22" nginx_cc_opts: "-Wno-error" - nginx: "1.21.4" - openssl: "3.1.4" + openssl: "3.1.5" openssl_fips: "3.0.8" extras: "valgrind" lua_nginx_module: "v0.10.25" @@ -48,23 +48,23 @@ jobs: lua_nginx_module: "v0.10.26" lua_resty_core: "v0.1.28" - nginx: "1.25.3" - openssl: "3.0.12" + openssl: "3.0.13" openssl_fips: "3.0.8" extras: "valgrind perf" lua_nginx_module: "v0.10.26" lua_resty_core: "v0.1.28" nginx_cc_opts: "-Wno-error" - nginx: "1.25.3" - openssl: "3.1.4" + openssl: "3.1.5" openssl_fips: "3.0.8" extras: "valgrind perf" lua_nginx_module: "v0.10.26" lua_resty_core: "v0.1.28" nginx_cc_opts: "-Wno-error" - nginx: "1.25.3" - openssl: "3.2.0" + openssl: "3.2.1" openssl_fips: "3.0.8" - extras: "valgrind perf" + extras: "valgrind perf lua-kong-nginx-module" lua_nginx_module: "v0.10.26" lua_resty_core: "v0.1.28" nginx_cc_opts: "-Wno-error" @@ -115,6 +115,7 @@ jobs: git clone https://github.com/openresty/lua-nginx-module.git ./lua-nginx-module -b ${{ matrix.lua_nginx_module }} git clone https://github.com/openresty/no-pool-nginx.git ./no-pool-nginx git clone https://github.com/fffonion/lua-resty-openssl-aux-module ./lua-resty-openssl-aux-module + git clone https://github.com/Kong/lua-kong-nginx-module.git ./lua-kong-nginx-module # lua libraries at parent directory of current repository popd git clone https://github.com/openresty/lua-resty-core.git ../lua-resty-core -b ${{ matrix.lua_resty_core }} @@ -170,15 +171,17 @@ jobs: - name: Build Nginx env: NGINX_CC_OPTS: ${{ matrix.nginx_cc_opts }} + NGINX_MODULES: "" run: | if [[ "${{ matrix.extras }}" == *valgrind* ]]; then NGINX_CC_OPTS="$NGINX_CC_OPTS -O0"; fi + if [[ "${{ matrix.extras }}" == *lua-kong-nginx-module* ]]; then NGINX_MODULES="$NGINX_MODULES --add-module=../lua-kong-nginx-module"; fi export PATH=$BASE_PATH/work/nginx/sbin:$BASE_PATH/../nginx-devel-utils:$PATH export LD_LIBRARY_PATH=$LUAJIT_LIB:$LD_LIBRARY_PATH export NGX_LUA_LOC=$BASE_PATH/../lua-nginx-module export NGX_STREAM_LUA_LOC=$BASE_PATH/../stream-lua-nginx-module export cd $BASE_PATH - if [ ! -e work ]; then ngx-build ${{ matrix.nginx }} --add-module=../ndk-nginx-module --add-module=../lua-nginx-module --add-module=../lua-resty-openssl-aux-module --with-http_ssl_module --with-cc-opt="-I$OPENSSL_INC $NGINX_CC_OPTS" --with-ld-opt="-L$OPENSSL_LIB -Wl,-rpath,$OPENSSL_LIB" --with-debug > build.log 2>&1 || (cat build.log && exit 1); fi + if [ ! -e work ]; then ngx-build ${{ matrix.nginx }} --add-module=../ndk-nginx-module --add-module=../lua-nginx-module --add-module=../lua-resty-openssl-aux-module $NGINX_MODULES --with-http_ssl_module --with-cc-opt="-I$OPENSSL_INC $NGINX_CC_OPTS" --with-ld-opt="-L$OPENSSL_LIB -Wl,-rpath,$OPENSSL_LIB" --with-debug > build.log 2>&1 || (cat build.log && exit 1); fi nginx -V ldd `which nginx`|grep -E 'luajit|ssl|pcre' @@ -191,6 +194,8 @@ jobs: echo "Nginx SSL plain FFI" export CI_SKIP_NGINX_C=1 TEST_NGINX_TIMEOUT=10 prove -j$JOBS t/openssl/ssl/ 2>&1 + export CI_SKIP_KONG_SSL_FUNCS=1 + TEST_NGINX_TIMEOUT=10 prove -j$JOBS t/openssl/ssl/ 2>&1 - name: Run Valgrind if: contains(matrix.extras, 'valgrind') @@ -205,6 +210,9 @@ jobs: export CI_SKIP_NGINX_C=1 stdbuf -o 0 -e 0 prove -j$JOBS t/openssl/ssl/ 2>&1 | grep -v "Connection refused" | grep -v "Retry connecting after" | tee output.log if grep -q 'insert_a_suppression_name_here' output.log; then echo "Valgrind found problems"; exit 1; fi + export CI_SKIP_KONG_SSL_FUNCS=1 + stdbuf -o 0 -e 0 prove -j$JOBS t/openssl/ssl/ 2>&1 | grep -v "Connection refused" | grep -v "Retry connecting after" | tee output.log + if grep -q 'insert_a_suppression_name_here' output.log; then echo "Valgrind found problems"; exit 1; fi - name: Run FIPS Test run: | diff --git a/src/deps/src/lua-resty-openssl/CHANGELOG.md b/src/deps/src/lua-resty-openssl/CHANGELOG.md index 3630d3390..fae52720d 100644 --- a/src/deps/src/lua-resty-openssl/CHANGELOG.md +++ b/src/deps/src/lua-resty-openssl/CHANGELOG.md @@ -2,6 +2,12 @@ ## [Unreleased] + +## [1.3.0] - 2024-04-15 +### features +- **aux/nginx:** use lua-kong-nginx-module's get_socket_ssl when available ([#3](https://github.com/fffonion/lua-resty-openssl/issues/3)) [48c5107](https://github.com/fffonion/lua-resty-openssl/commit/48c51077444e375b2cdd5155693b49d92a82d4a1) + + ## [1.2.1] - 2024-02-27 ### bug fixes @@ -488,8 +494,8 @@ - **autogen:** generate tests for x509, csr and crl [1392428](https://github.com/fffonion/lua-resty-openssl/commit/1392428352164d2a1a6e0c03075ff65b55aecdee) - **objects:** add helper function for ASN1_OBJECT [d037706](https://github.com/fffonion/lua-resty-openssl/commit/d037706c11d716afe3616bdaf4658afc1763081d) - **pkey:** asymmetric encryption and decryption [6d60451](https://github.com/fffonion/lua-resty-openssl/commit/6d60451157edbf9cefb634f888dfa3e6d9be302f) -- **x509:** getter/setters for extensions [243f40d](https://github.com/fffonion/lua-resty-openssl/commit/243f40d35562a516f404188a5c7eb8f5134d9b30) - **x509:** add get_ocsp_url and get_crl_url [6141b6f](https://github.com/fffonion/lua-resty-openssl/commit/6141b6f5aed38706b477a71d8c4383bf55da7eee) +- **x509:** getter/setters for extensions [243f40d](https://github.com/fffonion/lua-resty-openssl/commit/243f40d35562a516f404188a5c7eb8f5134d9b30) - **x509.altname:** support iterate and decode over the stack [083a201](https://github.com/fffonion/lua-resty-openssl/commit/083a201746e02d51f6c5c640ad9bf8c6730ebe0b) - **x509.crl:** add crl module [242f8cb](https://github.com/fffonion/lua-resty-openssl/commit/242f8cb45d6c2df5918f26540c92a430d42feb5d) - **x509.csr:** autogen some csr functions as well [9800e36](https://github.com/fffonion/lua-resty-openssl/commit/9800e36c2ff8a299b88f24091cc722940a8652bb) @@ -577,7 +583,8 @@ - **x509:** export pubkey [ede4f81](https://github.com/fffonion/lua-resty-openssl/commit/ede4f817cb0fe092ad6f9ab5d6ecdcde864a9fd8) -[Unreleased]: https://github.com/fffonion/lua-resty-openssl/compare/1.2.1...HEAD +[Unreleased]: https://github.com/fffonion/lua-resty-openssl/compare/1.3.0...HEAD +[1.3.0]: https://github.com/fffonion/lua-resty-openssl/compare/1.2.1...1.3.0 [1.2.1]: https://github.com/fffonion/lua-resty-openssl/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/fffonion/lua-resty-openssl/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/fffonion/lua-resty-openssl/compare/1.0.2...1.1.0 diff --git a/src/deps/src/lua-resty-openssl/lib/resty/openssl.lua b/src/deps/src/lua-resty-openssl/lib/resty/openssl.lua index 99748812a..d6f08507c 100644 --- a/src/deps/src/lua-resty-openssl/lib/resty/openssl.lua +++ b/src/deps/src/lua-resty-openssl/lib/resty/openssl.lua @@ -24,7 +24,7 @@ try_require_modules() local _M = { - _VERSION = '1.2.1', + _VERSION = '1.3.0', } function _M.load_modules() diff --git a/src/deps/src/lua-resty-openssl/lib/resty/openssl/auxiliary/nginx_c.lua b/src/deps/src/lua-resty-openssl/lib/resty/openssl/auxiliary/nginx_c.lua index f50db365a..767e89efc 100644 --- a/src/deps/src/lua-resty-openssl/lib/resty/openssl/auxiliary/nginx_c.lua +++ b/src/deps/src/lua-resty-openssl/lib/resty/openssl/auxiliary/nginx_c.lua @@ -1,5 +1,6 @@ local ffi = require "ffi" local C = ffi.C +local os = os local SOCKET_CTX_INDEX = 1 local NGX_OK = ngx.OK @@ -30,6 +31,8 @@ end local stream_subsystem = false +local get_sock_ssl + if ngx.config.subsystem == "stream" then stream_subsystem = true @@ -48,10 +51,21 @@ if ngx.config.subsystem == "stream" then int ngx_stream_lua_resty_openssl_aux_get_socket_ssl_ctx(ngx_stream_lua_socket_tcp_upstream_t *u, void **_sess); + + int ngx_stream_lua_kong_get_socket_ssl(ngx_stream_lua_socket_tcp_upstream_t *u, + void **ssl_conn); ]] -- sanity test local _ = C.ngx_stream_lua_resty_openssl_aux_get_request_ssl + local success + if not os.getenv("CI_SKIP_KONG_SSL_FUNCS") then + success, get_sock_ssl = pcall(function() return C.ngx_stream_lua_kong_get_socket_ssl end) + end + if not success or get_sock_ssl == nil then + get_sock_ssl = C.ngx_stream_lua_resty_openssl_aux_get_socket_ssl_ctx + end + else ffi.cdef [[ typedef struct ngx_http_request_s ngx_http_request_t; @@ -68,10 +82,20 @@ else int ngx_http_lua_resty_openssl_aux_get_socket_ssl_ctx(ngx_http_lua_socket_tcp_upstream_t *u, void **_sess); + + int ngx_http_lua_kong_ffi_get_socket_ssl(ngx_http_lua_socket_tcp_upstream_t *u, + void **ssl_conn); ]] -- sanity test local _ = C.ngx_http_lua_resty_openssl_aux_get_request_ssl + local success + if not os.getenv("CI_SKIP_KONG_SSL_FUNCS") then + success, get_sock_ssl = pcall(function() return C.ngx_http_lua_kong_ffi_get_socket_ssl end) + end + if not success or get_sock_ssl == nil then + get_sock_ssl = C.ngx_http_lua_resty_openssl_aux_get_socket_ssl + end end local void_pp = ffi.new("void *[1]") @@ -115,12 +139,7 @@ end get_socket_ssl = function(sock) local u = sock[SOCKET_CTX_INDEX] - local ret - if stream_subsystem then - ret = C.ngx_stream_lua_resty_openssl_aux_get_socket_ssl(u, void_pp) - else - ret = C.ngx_http_lua_resty_openssl_aux_get_socket_ssl(u, void_pp) - end + local ret = get_sock_ssl(u, void_pp) if ret ~= NGX_OK then return nil, "cannot read u->peer.connection->ssl->connection" @@ -151,4 +170,4 @@ return { get_req_ssl_ctx = get_req_ssl_ctx, get_socket_ssl = get_socket_ssl, get_socket_ssl_ctx = get_socket_ssl_ctx, -} \ No newline at end of file +} diff --git a/src/deps/src/lua-resty-openssl/lua-resty-openssl-1.2.1-1.rockspec b/src/deps/src/lua-resty-openssl/lua-resty-openssl-1.3.0-1.rockspec similarity index 99% rename from src/deps/src/lua-resty-openssl/lua-resty-openssl-1.2.1-1.rockspec rename to src/deps/src/lua-resty-openssl/lua-resty-openssl-1.3.0-1.rockspec index 37a67ceab..de1591350 100644 --- a/src/deps/src/lua-resty-openssl/lua-resty-openssl-1.2.1-1.rockspec +++ b/src/deps/src/lua-resty-openssl/lua-resty-openssl-1.3.0-1.rockspec @@ -1,8 +1,8 @@ package = "lua-resty-openssl" -version = "1.2.1-1" +version = "1.3.0-1" source = { url = "git+https://github.com/fffonion/lua-resty-openssl.git", - tag = "1.2.1" + tag = "1.3.0" } description = { detailed = "FFI-based OpenSSL binding for LuaJIT.", diff --git a/src/linux/fpm-centos b/src/linux/fpm-centos index 3e4182063..9562529e5 100644 --- a/src/linux/fpm-centos +++ b/src/linux/fpm-centos @@ -3,7 +3,7 @@ --license agpl3 --version %VERSION% --architecture x86_64 ---depends bash --depends epel-release --depends python39 --depends 'nginx = 1:1.24.0-1.el8.ngx' --depends libcurl-devel --depends libxml2 --depends yajl --depends lmdb-libs --depends GeoIP-devel --depends file-libs --depends net-tools --depends gd --depends sudo --depends procps --depends lsof --depends brotli --depends openssl --depends libpq --depends mysql --depends postgresql --depends sqlite +--depends bash --depends epel-release --depends python39 --depends 'nginx = 1:1.24.0-1.el8.ngx' --depends libcurl-devel --depends libxml2 --depends yajl --depends lmdb-libs --depends GeoIP-devel --depends file-libs --depends net-tools --depends gd --depends sudo --depends procps --depends lsof --depends brotli --depends openssl --depends libpq --depends mysql --depends postgresql --depends sqlite --depends unzip --description "BunkerWeb %VERSION% for CentOS Stream 8" --url "https://www.bunkerweb.io" --maintainer "Bunkerity " diff --git a/src/linux/fpm-debian b/src/linux/fpm-debian index 2afe68e27..8251d5348 100644 --- a/src/linux/fpm-debian +++ b/src/linux/fpm-debian @@ -3,7 +3,7 @@ --license agpl3 --version %VERSION% --architecture %ARCH% ---depends bash --depends python3 --depends procps --depends python3-pip --depends 'nginx = 1.24.0-1~bookworm' --depends libcurl4 --depends libgeoip-dev --depends libxml2 --depends libyajl2 --depends libmagic1 --depends net-tools --depends sudo --depends lsof --depends libpq5 --depends libpcre3 --depends libcap2-bin --depends logrotate --depends mariadb-client --depends postgresql-client --depends sqlite3 +--depends bash --depends python3 --depends procps --depends python3-pip --depends 'nginx = 1.24.0-1~bookworm' --depends libcurl4 --depends libgeoip-dev --depends libxml2 --depends libyajl2 --depends libmagic1 --depends net-tools --depends sudo --depends lsof --depends libpq5 --depends libpcre3 --depends libcap2-bin --depends logrotate --depends mariadb-client --depends postgresql-client --depends sqlite3 --depends unzip --description "BunkerWeb %VERSION% for Debian 12" --url "https://www.bunkerweb.io" --maintainer "Bunkerity " diff --git a/src/linux/fpm-fedora b/src/linux/fpm-fedora index a5b8a35c1..0b51fe22b 100644 --- a/src/linux/fpm-fedora +++ b/src/linux/fpm-fedora @@ -3,7 +3,7 @@ --license agpl3 --version %VERSION% --architecture %ARCH% ---depends bash --depends python3 --depends 'nginx >= 1:1.24.0' --depends 'nginx < 1:1.25.0' --depends libcurl-devel --depends libxml2 --depends yajl --depends lmdb-libs --depends geoip-devel --depends gd --depends sudo --depends procps --depends lsof --depends nginx-mod-stream --depends pcre --depends libpq --depends libcap --depends openssl --depends logrotate --depends mysql --depends postgresql --depends sqlite3 +--depends bash --depends python3 --depends 'nginx >= 1:1.24.0' --depends 'nginx < 1:1.25.0' --depends libcurl-devel --depends libxml2 --depends yajl --depends lmdb-libs --depends geoip-devel --depends gd --depends sudo --depends procps --depends lsof --depends nginx-mod-stream --depends pcre --depends libpq --depends libcap --depends openssl --depends logrotate --depends mysql --depends postgresql --depends sqlite3 --depends unzip --description "BunkerWeb %VERSION% for Fedora 39" --url "https://www.bunkerweb.io" --maintainer "Bunkerity " diff --git a/src/linux/fpm-rhel b/src/linux/fpm-rhel index eaa61287f..d39f67d8b 100644 --- a/src/linux/fpm-rhel +++ b/src/linux/fpm-rhel @@ -3,7 +3,7 @@ --license agpl3 --version %VERSION% --architecture %ARCH% ---depends bash --depends python39 --depends 'nginx >= 1:1.24.0' --depends 'nginx < 1:1.25.0' --depends libcurl-devel --depends libxml2 --depends yajl --depends file-libs --depends net-tools --depends gd --depends sudo --depends procps --depends lsof --depends geoip --depends libpq --depends libcap --depends openssl --depends sqlite +--depends bash --depends python39 --depends 'nginx >= 1:1.24.0' --depends 'nginx < 1:1.25.0' --depends libcurl-devel --depends libxml2 --depends yajl --depends file-libs --depends net-tools --depends gd --depends sudo --depends procps --depends lsof --depends geoip --depends libpq --depends libcap --depends openssl --depends sqlite --depends unzip --description "BunkerWeb %VERSION% for RHEL 8" --url "https://www.bunkerweb.io" --maintainer "Bunkerity " diff --git a/src/linux/fpm-rhel9 b/src/linux/fpm-rhel9 index ca00ecce1..99dae9a8c 100644 --- a/src/linux/fpm-rhel9 +++ b/src/linux/fpm-rhel9 @@ -3,7 +3,7 @@ --license agpl3 --version %VERSION% --architecture %ARCH% ---depends bash --depends python39 --depends 'nginx >= 1:1.24.0' --depends 'nginx < 1:1.25.0' --depends libcurl-devel --depends libxml2 --depends yajl --depends file-libs --depends net-tools --depends gd --depends sudo --depends procps --depends lsof --depends libmaxminddb --depends libpq --depends libcap --depends openssl --depends mysql --depends postgresql --depends sqlite +--depends bash --depends python39 --depends 'nginx >= 1:1.24.0' --depends 'nginx < 1:1.25.0' --depends libcurl-devel --depends libxml2 --depends yajl --depends file-libs --depends net-tools --depends gd --depends sudo --depends procps --depends lsof --depends libmaxminddb --depends libpq --depends libcap --depends openssl --depends mysql --depends postgresql --depends sqlite --depends unzip --description "BunkerWeb %VERSION% for RHEL 9" --url "https://www.bunkerweb.io" --maintainer "Bunkerity " diff --git a/src/linux/fpm-ubuntu b/src/linux/fpm-ubuntu index cc07ff919..11dbeeffe 100644 --- a/src/linux/fpm-ubuntu +++ b/src/linux/fpm-ubuntu @@ -3,7 +3,7 @@ --license agpl3 --version %VERSION% --architecture %ARCH% ---depends bash --depends python3 --depends python3-pip --depends 'nginx = 1.24.0-1~jammy' --depends libcurl4 --depends libgeoip-dev --depends libxml2 --depends libyajl2 --depends libmagic1 --depends net-tools --depends sudo --depends procps --depends lsof --depends libpq5 --depends libcap2-bin --depends logrotate --depends mariadb-client --depends postgresql-client --depends sqlite3 +--depends bash --depends python3 --depends python3-pip --depends 'nginx = 1.24.0-1~jammy' --depends libcurl4 --depends libgeoip-dev --depends libxml2 --depends libyajl2 --depends libmagic1 --depends net-tools --depends sudo --depends procps --depends lsof --depends libpq5 --depends libcap2-bin --depends logrotate --depends mariadb-client --depends postgresql-client --depends sqlite3 --depends unzip --description "BunkerWeb %VERSION% for Ubuntu 22.04" --url "https://www.bunkerweb.io" --maintainer "Bunkerity " diff --git a/src/linux/scripts/start.sh b/src/linux/scripts/start.sh index 206bc8cb1..4165f4c9f 100644 --- a/src/linux/scripts/start.sh +++ b/src/linux/scripts/start.sh @@ -113,8 +113,10 @@ function start() { stop_nginx # Check if we are in slave/master mode - export MASTER_MODE="$(grep "^MASTER_MODE=" /etc/bunkerweb/variables.env | cut -d '=' -f 2)" - export SLAVE_MODE="$(grep "^SLAVE_MODE=" /etc/bunkerweb/variables.env | cut -d '=' -f 2)" + MASTER_MODE="$(grep "^MASTER_MODE=" /etc/bunkerweb/variables.env | cut -d '=' -f 2)" + export MASTER_MODE + SLAVE_MODE="$(grep "^SLAVE_MODE=" /etc/bunkerweb/variables.env | cut -d '=' -f 2)" + export SLAVE_MODE if [ "$MASTER_MODE" != "yes" ] ; then # Generate temp conf for jobs and start nginx diff --git a/src/scheduler/Dockerfile b/src/scheduler/Dockerfile index d0aca1c66..606a03ff9 100644 --- a/src/scheduler/Dockerfile +++ b/src/scheduler/Dockerfile @@ -46,7 +46,7 @@ COPY --from=builder --chown=0:101 /usr/share/bunkerweb /usr/share/bunkerweb WORKDIR /usr/share/bunkerweb # Add scheduler user, drop bwcli, install runtime dependencies, create data folders and set permissions -RUN apk add --no-cache bash libgcc libstdc++ libpq openssl libmagic mariadb-client postgresql-client sqlite && \ +RUN apk add --no-cache bash unzip libgcc libstdc++ libpq openssl libmagic mariadb-client postgresql-client sqlite && \ addgroup -g 101 scheduler && \ adduser -h /var/cache/nginx -g scheduler -s /bin/sh -G scheduler -D -H -u 101 scheduler && \ cp helpers/bwcli /usr/bin/ && \ diff --git a/src/ui/Dockerfile b/src/ui/Dockerfile index aec8b0865..8b4c46966 100644 --- a/src/ui/Dockerfile +++ b/src/ui/Dockerfile @@ -44,7 +44,7 @@ COPY --from=builder --chown=0:101 /usr/share/bunkerweb /usr/share/bunkerweb WORKDIR /usr/share/bunkerweb # Add ui user, install runtime dependencies, create data folders and set permissions -RUN apk add --no-cache bash libmagic mariadb-client postgresql-client sqlite && \ +RUN apk add --no-cache bash unzip libmagic mariadb-client postgresql-client sqlite && \ addgroup -g 101 ui && \ adduser -h /var/cache/nginx -g ui -s /bin/sh -G ui -D -H -u 101 ui && \ echo "Docker" > INTEGRATION && \ diff --git a/src/ui/main.py b/src/ui/main.py index d86ea80a6..66f90ce15 100755 --- a/src/ui/main.py +++ b/src/ui/main.py @@ -9,6 +9,7 @@ from string import ascii_letters, digits from sys import path as sys_path, modules as sys_modules from pathlib import Path from typing import Union +from uuid import uuid4 for deps_path in [join(sep, "usr", "share", "bunkerweb", *paths) for paths in (("deps", "python"), ("utils",), ("api",), ("db",))]: if deps_path not in sys_path: @@ -302,18 +303,39 @@ def run_action(plugin: str, function_name: str = ""): if module is None: return {"status": "ko", "code": 404, "message": "The actions.py file for the plugin does not exist"} + obfuscation = db.get_plugin_obfuscation(plugin) + tmp_dir = None + try: # Try to import the custom plugin - with NamedTemporaryFile(mode="wb", suffix=".py", delete=True) as temp: - temp.write(module) - temp.flush() - temp.seek(0) - loader = SourceFileLoader("actions", temp.name) + if obfuscation: + tmp_dir = Path(sep, "var", "tmp", "bunkerweb", "ui", "action", str(uuid4())) + tmp_dir.mkdir(parents=True, exist_ok=True) + + action_file = tmp_dir.joinpath("actions.py") + with ZipFile(BytesIO(obfuscation), "r") as zip_ref: + zip_ref.extractall(tmp_dir) + action_file.write_bytes(module) + sys_path.append(tmp_dir.as_posix()) + loader = SourceFileLoader("actions", action_file.as_posix()) actions = loader.load_module() + else: + with NamedTemporaryFile(mode="wb", suffix=".py", delete=True) as temp: + temp.write(module) + temp.flush() + temp.seek(0) + loader = SourceFileLoader("actions", temp.name) + actions = loader.load_module() except: + if tmp_dir: + sys_path.pop() + rmtree(tmp_dir, ignore_errors=True) + + app.logger.exception("An error occurred while importing the plugin") return {"status": "ko", "code": 500, "message": "An error occurred while importing the plugin, see logs for more details"} res = None + message = None try: # Try to get the custom plugin custom function and call it @@ -332,11 +354,15 @@ def run_action(plugin: str, function_name: str = ""): finally: if sbin_nginx_path.is_file(): # Remove the custom plugin from the shared library - if sys_path: - sys_path.pop() sys_modules.pop("actions", None) del actions + if tmp_dir: + sys_path.pop() + rmtree(tmp_dir, ignore_errors=True) + + if message: + app.logger.exception(message) if message or not isinstance(res, dict) and not res: return {"status": "ko", "code": 500, "message": message or "The plugin did not return a valid response"} @@ -401,7 +427,7 @@ def inject_variables(): pro_expire=metadata["pro_expire"].strftime("%d-%m-%Y") if metadata["pro_expire"] else "Unknown", pro_overlapped=metadata["pro_overlapped"], plugins=app.config["CONFIG"].get_plugins(), - bw_version="1.5.7" + bw_version=bw_version, ) @@ -572,6 +598,7 @@ def setup(): "REVERSE_PROXY_URL": request.form["ui_url"] or "/", "AUTO_LETS_ENCRYPT": request.form.get("auto_lets_encrypt", "no"), "INTERCEPTED_ERROR_CODES": "400 404 405 413 429 500 501 502 503 504", + "MAX_CLIENT_SIZE": "50m", }, request.form["server_name"], request.form["server_name"], diff --git a/src/ui/requirements.in b/src/ui/requirements.in index 76af0996d..e32e5b148 100644 --- a/src/ui/requirements.in +++ b/src/ui/requirements.in @@ -3,11 +3,11 @@ beautifulsoup4==4.12.3 Flask==3.0.3 Flask-Login==0.6.3 Flask_WTF==1.2.1 -gunicorn[gthread]==21.2.0 +gunicorn[gthread]==22.0.0 importlib-metadata==7.1.0 pyotp==2.9.0 python-magic==0.4.27 python_dateutil==2.9.0.post0 qrcode==7.4.2 -regex==2023.12.25 +regex==2024.4.16 werkzeug==3.0.2 diff --git a/src/ui/requirements.txt b/src/ui/requirements.txt index 4d11c6a8f..551fdeb1d 100644 --- a/src/ui/requirements.txt +++ b/src/ui/requirements.txt @@ -60,9 +60,9 @@ flask-wtf==1.2.1 \ --hash=sha256:8bb269eb9bb46b87e7c8233d7e7debdf1f8b74bf90cc1789988c29b37a97b695 \ --hash=sha256:fa6793f2fb7e812e0fe9743b282118e581fb1b6c45d414b8af05e659bd653287 # via -r requirements.in -gunicorn==21.2.0 \ - --hash=sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0 \ - --hash=sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033 +gunicorn==22.0.0 \ + --hash=sha256:350679f91b24062c86e386e198a15438d53a7a8207235a78ba1b53df4c4378d9 \ + --hash=sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63 # via -r requirements.in importlib-metadata==7.1.0 \ --hash=sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 \ @@ -70,9 +70,9 @@ importlib-metadata==7.1.0 \ # via # -r requirements.in # flask -itsdangerous==2.1.2 \ - --hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \ - --hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a +itsdangerous==2.2.0 \ + --hash=sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef \ + --hash=sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173 # via # flask # flask-wtf @@ -169,100 +169,100 @@ qrcode==7.4.2 \ --hash=sha256:581dca7a029bcb2deef5d01068e39093e80ef00b4a61098a2182eac59d01643a \ --hash=sha256:9dd969454827e127dbd93696b20747239e6d540e082937c90f14ac95b30f5845 # via -r requirements.in -regex==2023.12.25 \ - --hash=sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5 \ - --hash=sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770 \ - --hash=sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc \ - --hash=sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105 \ - --hash=sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d \ - --hash=sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b \ - --hash=sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9 \ - --hash=sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630 \ - --hash=sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6 \ - --hash=sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c \ - --hash=sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482 \ - --hash=sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6 \ - --hash=sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a \ - --hash=sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80 \ - --hash=sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5 \ - --hash=sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1 \ - --hash=sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f \ - --hash=sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf \ - --hash=sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb \ - --hash=sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2 \ - --hash=sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347 \ - --hash=sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20 \ - --hash=sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060 \ - --hash=sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5 \ - --hash=sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73 \ - --hash=sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f \ - --hash=sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d \ - --hash=sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3 \ - --hash=sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae \ - --hash=sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4 \ - --hash=sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2 \ - --hash=sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457 \ - --hash=sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c \ - --hash=sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4 \ - --hash=sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87 \ - --hash=sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0 \ - --hash=sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704 \ - --hash=sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f \ - --hash=sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f \ - --hash=sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b \ - --hash=sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5 \ - --hash=sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923 \ - --hash=sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715 \ - --hash=sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c \ - --hash=sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca \ - --hash=sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1 \ - --hash=sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756 \ - --hash=sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360 \ - --hash=sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc \ - --hash=sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445 \ - --hash=sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e \ - --hash=sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4 \ - --hash=sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a \ - --hash=sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8 \ - --hash=sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53 \ - --hash=sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697 \ - --hash=sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf \ - --hash=sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a \ - --hash=sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415 \ - --hash=sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f \ - --hash=sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9 \ - --hash=sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400 \ - --hash=sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d \ - --hash=sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392 \ - --hash=sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb \ - --hash=sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd \ - --hash=sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861 \ - --hash=sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232 \ - --hash=sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95 \ - --hash=sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7 \ - --hash=sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39 \ - --hash=sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887 \ - --hash=sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5 \ - --hash=sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39 \ - --hash=sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb \ - --hash=sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586 \ - --hash=sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97 \ - --hash=sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423 \ - --hash=sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69 \ - --hash=sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7 \ - --hash=sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1 \ - --hash=sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7 \ - --hash=sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5 \ - --hash=sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8 \ - --hash=sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91 \ - --hash=sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590 \ - --hash=sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe \ - --hash=sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c \ - --hash=sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64 \ - --hash=sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd \ - --hash=sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa \ - --hash=sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31 \ - --hash=sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988 +regex==2024.4.16 \ + --hash=sha256:00169caa125f35d1bca6045d65a662af0202704489fada95346cfa092ec23f39 \ + --hash=sha256:03576e3a423d19dda13e55598f0fd507b5d660d42c51b02df4e0d97824fdcae3 \ + --hash=sha256:03e68f44340528111067cecf12721c3df4811c67268b897fbe695c95f860ac42 \ + --hash=sha256:0534b034fba6101611968fae8e856c1698da97ce2efb5c2b895fc8b9e23a5834 \ + --hash=sha256:08dea89f859c3df48a440dbdcd7b7155bc675f2fa2ec8c521d02dc69e877db70 \ + --hash=sha256:0a38d151e2cdd66d16dab550c22f9521ba79761423b87c01dae0a6e9add79c0d \ + --hash=sha256:0c8290b44d8b0af4e77048646c10c6e3aa583c1ca67f3b5ffb6e06cf0c6f0f89 \ + --hash=sha256:10188fe732dec829c7acca7422cdd1bf57d853c7199d5a9e96bb4d40db239c73 \ + --hash=sha256:1210365faba7c2150451eb78ec5687871c796b0f1fa701bfd2a4a25420482d26 \ + --hash=sha256:12f6a3f2f58bb7344751919a1876ee1b976fe08b9ffccb4bbea66f26af6017b9 \ + --hash=sha256:159dc4e59a159cb8e4e8f8961eb1fa5d58f93cb1acd1701d8aff38d45e1a84a6 \ + --hash=sha256:20b7a68444f536365af42a75ccecb7ab41a896a04acf58432db9e206f4e525d6 \ + --hash=sha256:23cff1b267038501b179ccbbd74a821ac4a7192a1852d1d558e562b507d46013 \ + --hash=sha256:2c72608e70f053643437bd2be0608f7f1c46d4022e4104d76826f0839199347a \ + --hash=sha256:3399dd8a7495bbb2bacd59b84840eef9057826c664472e86c91d675d007137f5 \ + --hash=sha256:34422d5a69a60b7e9a07a690094e824b66f5ddc662a5fc600d65b7c174a05f04 \ + --hash=sha256:370c68dc5570b394cbaadff50e64d705f64debed30573e5c313c360689b6aadc \ + --hash=sha256:3a1018e97aeb24e4f939afcd88211ace472ba566efc5bdf53fd8fd7f41fa7170 \ + --hash=sha256:3d5ac5234fb5053850d79dd8eb1015cb0d7d9ed951fa37aa9e6249a19aa4f336 \ + --hash=sha256:4313ab9bf6a81206c8ac28fdfcddc0435299dc88cad12cc6305fd0e78b81f9e4 \ + --hash=sha256:445ca8d3c5a01309633a0c9db57150312a181146315693273e35d936472df912 \ + --hash=sha256:479595a4fbe9ed8f8f72c59717e8cf222da2e4c07b6ae5b65411e6302af9708e \ + --hash=sha256:4918fd5f8b43aa7ec031e0fef1ee02deb80b6afd49c85f0790be1dc4ce34cb50 \ + --hash=sha256:4aba818dcc7263852aabb172ec27b71d2abca02a593b95fa79351b2774eb1d2b \ + --hash=sha256:4e819a806420bc010489f4e741b3036071aba209f2e0989d4750b08b12a9343f \ + --hash=sha256:4facc913e10bdba42ec0aee76d029aedda628161a7ce4116b16680a0413f658a \ + --hash=sha256:549c3584993772e25f02d0656ac48abdda73169fe347263948cf2b1cead622f3 \ + --hash=sha256:5c02fcd2bf45162280613d2e4a1ca3ac558ff921ae4e308ecb307650d3a6ee51 \ + --hash=sha256:5f580c651a72b75c39e311343fe6875d6f58cf51c471a97f15a938d9fe4e0d37 \ + --hash=sha256:62120ed0de69b3649cc68e2965376048793f466c5a6c4370fb27c16c1beac22d \ + --hash=sha256:6295004b2dd37b0835ea5c14a33e00e8cfa3c4add4d587b77287825f3418d310 \ + --hash=sha256:65436dce9fdc0aeeb0a0effe0839cb3d6a05f45aa45a4d9f9c60989beca78b9c \ + --hash=sha256:684008ec44ad275832a5a152f6e764bbe1914bea10968017b6feaecdad5736e0 \ + --hash=sha256:684e52023aec43bdf0250e843e1fdd6febbe831bd9d52da72333fa201aaa2335 \ + --hash=sha256:6cc38067209354e16c5609b66285af17a2863a47585bcf75285cab33d4c3b8df \ + --hash=sha256:6f2f017c5be19984fbbf55f8af6caba25e62c71293213f044da3ada7091a4455 \ + --hash=sha256:743deffdf3b3481da32e8a96887e2aa945ec6685af1cfe2bcc292638c9ba2f48 \ + --hash=sha256:7571f19f4a3fd00af9341c7801d1ad1967fc9c3f5e62402683047e7166b9f2b4 \ + --hash=sha256:7731728b6568fc286d86745f27f07266de49603a6fdc4d19c87e8c247be452af \ + --hash=sha256:785c071c982dce54d44ea0b79cd6dfafddeccdd98cfa5f7b86ef69b381b457d9 \ + --hash=sha256:78fddb22b9ef810b63ef341c9fcf6455232d97cfe03938cbc29e2672c436670e \ + --hash=sha256:7bb966fdd9217e53abf824f437a5a2d643a38d4fd5fd0ca711b9da683d452969 \ + --hash=sha256:7cbc5d9e8a1781e7be17da67b92580d6ce4dcef5819c1b1b89f49d9678cc278c \ + --hash=sha256:803b8905b52de78b173d3c1e83df0efb929621e7b7c5766c0843704d5332682f \ + --hash=sha256:80b696e8972b81edf0af2a259e1b2a4a661f818fae22e5fa4fa1a995fb4a40fd \ + --hash=sha256:81500ed5af2090b4a9157a59dbc89873a25c33db1bb9a8cf123837dcc9765047 \ + --hash=sha256:89ec7f2c08937421bbbb8b48c54096fa4f88347946d4747021ad85f1b3021b3c \ + --hash=sha256:8ba6745440b9a27336443b0c285d705ce73adb9ec90e2f2004c64d95ab5a7598 \ + --hash=sha256:8c91e1763696c0eb66340c4df98623c2d4e77d0746b8f8f2bee2c6883fd1fe18 \ + --hash=sha256:8d015604ee6204e76569d2f44e5a210728fa917115bef0d102f4107e622b08d5 \ + --hash=sha256:8d1f86f3f4e2388aa3310b50694ac44daefbd1681def26b4519bd050a398dc5a \ + --hash=sha256:8f83b6fd3dc3ba94d2b22717f9c8b8512354fd95221ac661784df2769ea9bba9 \ + --hash=sha256:8fc6976a3395fe4d1fbeb984adaa8ec652a1e12f36b56ec8c236e5117b585427 \ + --hash=sha256:904c883cf10a975b02ab3478bce652f0f5346a2c28d0a8521d97bb23c323cc8b \ + --hash=sha256:911742856ce98d879acbea33fcc03c1d8dc1106234c5e7d068932c945db209c0 \ + --hash=sha256:91797b98f5e34b6a49f54be33f72e2fb658018ae532be2f79f7c63b4ae225145 \ + --hash=sha256:95399831a206211d6bc40224af1c635cb8790ddd5c7493e0bd03b85711076a53 \ + --hash=sha256:956b58d692f235cfbf5b4f3abd6d99bf102f161ccfe20d2fd0904f51c72c4c66 \ + --hash=sha256:98c1165f3809ce7774f05cb74e5408cd3aa93ee8573ae959a97a53db3ca3180d \ + --hash=sha256:9ab40412f8cd6f615bfedea40c8bf0407d41bf83b96f6fc9ff34976d6b7037fd \ + --hash=sha256:9df1bfef97db938469ef0a7354b2d591a2d438bc497b2c489471bec0e6baf7c4 \ + --hash=sha256:a01fe2305e6232ef3e8f40bfc0f0f3a04def9aab514910fa4203bafbc0bb4682 \ + --hash=sha256:a70b51f55fd954d1f194271695821dd62054d949efd6368d8be64edd37f55c86 \ + --hash=sha256:a7ccdd1c4a3472a7533b0a7aa9ee34c9a2bef859ba86deec07aff2ad7e0c3b94 \ + --hash=sha256:b340cccad138ecb363324aa26893963dcabb02bb25e440ebdf42e30963f1a4e0 \ + --hash=sha256:b74586dd0b039c62416034f811d7ee62810174bb70dffcca6439f5236249eb09 \ + --hash=sha256:b9d320b3bf82a39f248769fc7f188e00f93526cc0fe739cfa197868633d44701 \ + --hash=sha256:ba2336d6548dee3117520545cfe44dc28a250aa091f8281d28804aa8d707d93d \ + --hash=sha256:ba8122e3bb94ecda29a8de4cf889f600171424ea586847aa92c334772d200331 \ + --hash=sha256:bd727ad276bb91928879f3aa6396c9a1d34e5e180dce40578421a691eeb77f47 \ + --hash=sha256:c21fc21a4c7480479d12fd8e679b699f744f76bb05f53a1d14182b31f55aac76 \ + --hash=sha256:c2d0e7cbb6341e830adcbfa2479fdeebbfbb328f11edd6b5675674e7a1e37730 \ + --hash=sha256:c2ef6f7990b6e8758fe48ad08f7e2f66c8f11dc66e24093304b87cae9037bb4a \ + --hash=sha256:c4ed75ea6892a56896d78f11006161eea52c45a14994794bcfa1654430984b22 \ + --hash=sha256:cccc79a9be9b64c881f18305a7c715ba199e471a3973faeb7ba84172abb3f317 \ + --hash=sha256:d0800631e565c47520aaa04ae38b96abc5196fe8b4aa9bd864445bd2b5848a7a \ + --hash=sha256:d2da13568eff02b30fd54fccd1e042a70fe920d816616fda4bf54ec705668d81 \ + --hash=sha256:d61ae114d2a2311f61d90c2ef1358518e8f05eafda76eaf9c772a077e0b465ec \ + --hash=sha256:d83c2bc678453646f1a18f8db1e927a2d3f4935031b9ad8a76e56760461105dd \ + --hash=sha256:dd5acc0a7d38fdc7a3a6fd3ad14c880819008ecb3379626e56b163165162cc46 \ + --hash=sha256:df79012ebf6f4efb8d307b1328226aef24ca446b3ff8d0e30202d7ebcb977a8c \ + --hash=sha256:e0a2df336d1135a0b3a67f3bbf78a75f69562c1199ed9935372b82215cddd6e2 \ + --hash=sha256:e2f142b45c6fed48166faeb4303b4b58c9fcd827da63f4cf0a123c3480ae11fb \ + --hash=sha256:e697e1c0238133589e00c244a8b676bc2cfc3ab4961318d902040d099fec7483 \ + --hash=sha256:e757d475953269fbf4b441207bb7dbdd1c43180711b6208e129b637792ac0b93 \ + --hash=sha256:e87ab229332ceb127a165612d839ab87795972102cb9830e5f12b8c9a5c1b508 \ + --hash=sha256:ea355eb43b11764cf799dda62c658c4d2fdb16af41f59bb1ccfec517b60bcb07 \ + --hash=sha256:ec7e0043b91115f427998febaa2beb82c82df708168b35ece3accb610b91fac1 \ + --hash=sha256:eeaa0b5328b785abc344acc6241cffde50dc394a0644a968add75fcefe15b9d4 \ + --hash=sha256:f2d80a6749724b37853ece57988b39c4e79d2b5fe2869a86e8aeae3bbeef9eb0 \ + --hash=sha256:fa454d26f2e87ad661c4f0c5a5fe4cf6aab1e307d1b94f16ffdfcb089ba685c0 \ + --hash=sha256:fb83cc090eac63c006871fd24db5e30a1f282faa46328572661c0a24a2323a08 \ + --hash=sha256:fd80d1280d473500d8086d104962a82d77bfbf2b118053824b7be28cd5a79ea5 # via -r requirements.in six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ diff --git a/src/ui/static/css/dashboard.css b/src/ui/static/css/dashboard.css index 62b37a34e..6cf238d02 100644 --- a/src/ui/static/css/dashboard.css +++ b/src/ui/static/css/dashboard.css @@ -1 +1 @@ -/*! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e9ecef}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Open Sans;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#ced4da}input::placeholder,textarea::placeholder{opacity:1;color:#ced4da}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#5e72e480;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.\!container{width:100%!important;margin-right:auto!important;margin-left:auto!important;padding-right:1.5rem!important;padding-left:1.5rem!important}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:1.5rem;padding-left:1.5rem}@media (min-width:340px){.\!container{max-width:340px!important}.container{max-width:340px}}@media (min-width:576px){.\!container{max-width:576px!important}.container{max-width:576px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:992px){.\!container{max-width:992px!important}.container{max-width:992px}}@media (min-width:1200px){.\!container{max-width:1200px!important}.container{max-width:1200px}}@media (min-width:1320px){.\!container{max-width:1320px!important}.container{max-width:1320px}}@media (min-width:1920px){.\!container{max-width:1920px!important}.container{max-width:1920px}}a{letter-spacing:-.025rem}hr{margin:1rem 0;border:0;opacity:.25}img{max-width:none}label{display:inline-block}p{line-height:1.625;font-weight:400;margin-bottom:1rem}small{font-size:.875em}svg{display:inline}table{border-collapse:inherit}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;color:#344767}h1,h2,h3,h4{letter-spacing:-.05rem}h1,h2,h3{font-weight:700}h4,h5,h6{font-weight:600}h1{font-size:3rem;line-height:1.25}h2{font-size:2.25rem;line-height:1.3}h3{font-size:1.875rem}h3,h4{line-height:1.375}h4{font-size:1.5rem}h5{font-size:1.25rem;line-height:1.375}h6{font-size:1rem;line-height:1.625}.sr-only{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-width:0!important}.pointer-events-none{pointer-events:none!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.collapse{visibility:collapse!important}.static{position:static!important}.fixed{position:fixed!important}.absolute{position:absolute!important}.relative{position:relative!important}.inset-y-0{top:0!important;bottom:0!important}.-left-full{left:-100%!important}.-right-0{right:0!important}.-right-1{right:-.25rem!important}.bottom-0{bottom:0!important}.bottom-1{bottom:.25rem!important}.bottom-1\.5{bottom:.375rem!important}.bottom-2{bottom:.5rem!important}.bottom-24{bottom:6rem!important}.bottom-3{bottom:.75rem!important}.bottom-4{bottom:1rem!important}.bottom-6{bottom:1.5rem!important}.bottom-7{bottom:1.75rem!important}.bottom-8{bottom:2rem!important}.left-0{left:0!important}.left-1{left:.25rem!important}.left-16{left:4rem!important}.left-20{left:5rem!important}.left-24{left:6rem!important}.left-32{left:8rem!important}.left-4{left:1rem!important}.left-40{left:10rem!important}.left-48{left:12rem!important}.left-8{left:2rem!important}.left-auto{left:auto!important}.left-full{left:100%!important}.right-0{right:0!important}.right-12{right:3rem!important}.right-2{right:.5rem!important}.right-20{right:5rem!important}.right-4{right:1rem!important}.right-5{right:1.25rem!important}.right-6{right:1.5rem!important}.right-7{right:1.75rem!important}.right-8{right:2rem!important}.right-\[3\.25rem\]{right:3.25rem!important}.top-0{top:0!important}.top-1{top:.25rem!important}.top-1\.5{top:.375rem!important}.top-1\/2{top:50%!important}.top-10{top:2.5rem!important}.top-12{top:3rem!important}.top-14{top:3.5rem!important}.top-16{top:4rem!important}.top-2{top:.5rem!important}.top-24{top:6rem!important}.top-3{top:.75rem!important}.top-36{top:9rem!important}.top-4{top:1rem!important}.top-6{top:1.5rem!important}.top-7{top:1.75rem!important}.top-8{top:2rem!important}.top-\[38\%\]{top:38%!important}.top-\[4\.5rem\]{top:4.5rem!important}.top-\[52\%\]{top:52%!important}.top-\[55\%\]{top:55%!important}.top-\[8\.2rem\]{top:8.2rem!important}.-z-10{z-index:-10!important}.z-0{z-index:0!important}.z-10{z-index:10!important}.z-100{z-index:100!important}.z-110{z-index:110!important}.z-20{z-index:20!important}.z-990{z-index:990!important}.z-\[10000\]{z-index:10000!important}.z-\[1000\]{z-index:1000!important}.z-\[1001\]{z-index:1001!important}.z-\[20\]{z-index:20!important}.z-sticky{z-index:1020!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.col-span-1{grid-column:span 1/span 1!important}.col-span-10{grid-column:span 10/span 10!important}.col-span-11{grid-column:span 11/span 11!important}.col-span-12{grid-column:span 12/span 12!important}.col-span-2{grid-column:span 2/span 2!important}.col-span-3{grid-column:span 3/span 3!important}.col-span-4{grid-column:span 4/span 4!important}.col-span-5{grid-column:span 5/span 5!important}.col-span-6{grid-column:span 6/span 6!important}.col-span-9{grid-column:span 9/span 9!important}.float-right{float:right!important}.float-left{float:left!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-1\.5{margin-left:.375rem!important;margin-right:.375rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-2\.5{margin-left:.625rem!important;margin-right:.625rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.mx-auto{margin-left:auto!important;margin-right: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:.75rem!important;margin-bottom:.75rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.mb-0{margin-bottom:0!important}.mb-0\.5{margin-bottom:.125rem!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-2\.5{margin-bottom:.625rem!important}.mb-3{margin-bottom:.75rem!important}.mb-4{margin-bottom:1rem!important}.mb-6{margin-bottom:1.5rem!important}.mb-7{margin-bottom:1.75rem!important}.mb-8{margin-bottom:2rem!important}.ml-0{margin-left:0!important}.ml-1{margin-left:.25rem!important}.ml-12{margin-left:3rem!important}.ml-2{margin-left:.5rem!important}.ml-3{margin-left:.75rem!important}.ml-4{margin-left:1rem!important}.mr-1{margin-right:.25rem!important}.mr-12{margin-right:3rem!important}.mr-2{margin-right:.5rem!important}.mr-3{margin-right:.75rem!important}.mr-4{margin-right:1rem!important}.mt-0{margin-top:0!important}.mt-0\.5{margin-top:.125rem!important}.mt-1{margin-top:.25rem!important}.mt-10{margin-top:2.5rem!important}.mt-12{margin-top:3rem!important}.mt-16{margin-top:4rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:.75rem!important}.mt-4{margin-top:1rem!important}.mt-5{margin-top:1.25rem!important}.mt-6{margin-top:1.5rem!important}.mt-8{margin-top:2rem!important}.mt-\[15vh\]{margin-top:15vh!important}.mt-\[4\.5rem\]{margin-top:4.5rem!important}.block{display:block!important}.inline-block{display:inline-block!important}.inline{display:inline!important}.flex{display:flex!important}.table{display:table!important}.grid{display:grid!important}.list-item{display:list-item!important}.\!hidden,.hidden{display:none!important}.h-1{height:.25rem!important}.h-1\/3{height:33.333333%!important}.h-12{height:3rem!important}.h-14{height:3.5rem!important}.h-3{height:.75rem!important}.h-32{height:8rem!important}.h-4{height:1rem!important}.h-4\.5{height:1.125rem!important}.h-40{height:10rem!important}.h-5{height:1.25rem!important}.h-5\.5{height:1.375rem!important}.h-6{height:1.5rem!important}.h-7{height:1.75rem!important}.h-8{height:2rem!important}.h-96{height:24rem!important}.h-\[2\.5rem\]{height:2.5rem!important}.h-\[250px\]{height:250px!important}.h-\[3\.5rem\]{height:3.5rem!important}.h-\[4rem\]{height:4rem!important}.h-\[90vh\]{height:90vh!important}.h-fit{height:-moz-fit-content!important;height:fit-content!important}.h-full{height:100%!important}.h-px{height:1px!important}.h-screen{height:100vh!important}.max-h-100{max-height:25rem!important}.max-h-30{max-height:7.5rem!important}.max-h-80{max-height:20rem!important}.max-h-\[250px\]{max-height:250px!important}.max-h-\[350px\]{max-height:350px!important}.max-h-\[400px\]{max-height:400px!important}.max-h-\[70vh\]{max-height:70vh!important}.max-h-\[90vh\]{max-height:90vh!important}.max-h-\[95vh\]{max-height:95vh!important}.max-h-screen{max-height:100vh!important}.min-h-12{min-height:3rem!important}.min-h-20{min-height:5rem!important}.min-h-52{min-height:13rem!important}.min-h-6{min-height:1.5rem!important}.min-h-\[100px\]{min-height:100px!important}.min-h-\[200px\]{min-height:200px!important}.min-h-\[350px\]{min-height:350px!important}.min-h-\[400px\]{min-height:400px!important}.min-h-\[55vh\]{min-height:55vh!important}.min-h-\[75px\]{min-height:75px!important}.min-h-\[85vh\]{min-height:85vh!important}.min-h-screen{min-height:100vh!important}.w-1{width:.25rem!important}.w-10{width:2.5rem!important}.w-11\/12{width:91.666667%!important}.w-28{width:7rem!important}.w-3{width:.75rem!important}.w-32{width:8rem!important}.w-4{width:1rem!important}.w-4\.5{width:1.125rem!important}.w-40{width:10rem!important}.w-48{width:12rem!important}.w-5{width:1.25rem!important}.w-5\.5{width:1.375rem!important}.w-50{width:12.5rem!important}.w-6{width:1.5rem!important}.w-7{width:1.75rem!important}.w-8{width:2rem!important}.w-80{width:20rem!important}.w-90{width:22.5rem!important}.w-\[2\.5rem\]{width:2.5rem!important}.w-\[50vw\]{width:50vw!important}.w-auto{width:auto!important}.w-fit{width:-moz-fit-content!important;width:fit-content!important}.w-full{width:100%!important}.w-screen{width:100vw!important}.min-w-0{min-width:0!important}.min-w-\[1150px\]{min-width:1150px!important}.min-w-\[1300px\]{min-width:1300px!important}.min-w-\[200px\]{min-width:200px!important}.min-w-\[300px\]{min-width:300px!important}.min-w-\[600px\]{min-width:600px!important}.min-w-\[800px\]{min-width:800px!important}.min-w-\[900px\]{min-width:900px!important}.max-w-40{max-width:10rem!important}.max-w-60{max-width:15rem!important}.max-w-64{max-width:16rem!important}.max-w-\[1000px\]{max-width:1000px!important}.max-w-\[150px\]{max-width:150px!important}.max-w-\[1920px\]{max-width:1920px!important}.max-w-\[300px\]{max-width:300px!important}.max-w-\[400px\]{max-width:400px!important}.max-w-\[450px\]{max-width:450px!important}.max-w-\[550px\]{max-width:550px!important}.max-w-\[650px\]{max-width:650px!important}.max-w-\[700px\]{max-width:700px!important}.max-w-full{max-width:100%!important}.max-w-none{max-width:none!important}.max-w-screen-lg{max-width:992px!important}.flex-auto{flex:1 1 auto!important}.grow{flex-grow:1!important}.basis-full{flex-basis:100%!important}.border-collapse{border-collapse:collapse!important}.-translate-x-1{--tw-translate-x:-0.25rem!important}.-translate-x-1,.-translate-x-1\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-1\.5{--tw-translate-x:-0.375rem!important}.-translate-x-36{--tw-translate-x:-9rem!important}.-translate-x-36,.-translate-x-40{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-40{--tw-translate-x:-10rem!important}.-translate-x-48{--tw-translate-x:-12rem!important}.-translate-x-48,.-translate-x-52{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-52{--tw-translate-x:-13rem!important}.-translate-x-56{--tw-translate-x:-14rem!important}.-translate-x-56,.-translate-x-60{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-60{--tw-translate-x:-15rem!important}.-translate-x-64{--tw-translate-x:-16rem!important}.-translate-x-64,.-translate-x-72{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-72{--tw-translate-x:-18rem!important}.-translate-x-full{--tw-translate-x:-100%!important}.-translate-x-full,.-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-0{--tw-translate-y:-0px!important}.-translate-y-0\.4{--tw-translate-y:-0.1rem!important}.-translate-y-0\.4,.-translate-y-0\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-0\.5{--tw-translate-y:-0.125rem!important}.-translate-y-1{--tw-translate-y:-0.25rem!important}.-translate-y-1,.-translate-y-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-12{--tw-translate-y:-3rem!important}.-translate-y-16{--tw-translate-y:-4rem!important}.-translate-y-16,.-translate-y-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-2{--tw-translate-y:-0.5rem!important}.-translate-y-20{--tw-translate-y:-5rem!important}.-translate-y-20,.-translate-y-24{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-24{--tw-translate-y:-6rem!important}.-translate-y-28{--tw-translate-y:-7rem!important}.-translate-y-28,.-translate-y-36{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-36{--tw-translate-y:-9rem!important}.-translate-y-4{--tw-translate-y:-1rem!important}.-translate-y-4,.-translate-y-6{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-6{--tw-translate-y:-1.5rem!important}.-translate-y-8{--tw-translate-y:-2rem!important}.-translate-y-8,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-0{--tw-translate-x:0px!important}.translate-x-0\.5{--tw-translate-x:0.125rem!important}.translate-x-0\.5,.translate-x-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-1{--tw-translate-x:0.25rem!important}.translate-x-16{--tw-translate-x:4rem!important}.translate-x-16,.translate-x-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-2{--tw-translate-x:0.5rem!important}.translate-x-24{--tw-translate-x:6rem!important}.translate-x-24,.translate-x-3{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-3{--tw-translate-x:0.75rem!important}.translate-x-32{--tw-translate-x:8rem!important}.translate-x-32,.translate-x-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-4{--tw-translate-x:1rem!important}.translate-x-40{--tw-translate-x:10rem!important}.translate-x-40,.translate-x-48{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-48{--tw-translate-x:12rem!important}.translate-x-52{--tw-translate-x:13rem!important}.translate-x-52,.translate-x-56{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-56{--tw-translate-x:14rem!important}.translate-x-60{--tw-translate-x:15rem!important}.translate-x-60,.translate-x-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-90{--tw-translate-x:22.5rem!important}.translate-x-\[3rem\]{--tw-translate-x:3rem!important}.translate-x-\[3rem\],.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-y-0{--tw-translate-y:0px!important}.translate-y-0\.5{--tw-translate-y:0.125rem!important}.translate-y-0\.5,.translate-y-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-y-1{--tw-translate-y:0.25rem!important}.translate-y-16{--tw-translate-y:4rem!important}.translate-y-16,.translate-y-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-y-2{--tw-translate-y:0.5rem!important}.-rotate-12{--tw-rotate:-12deg!important}.-rotate-12,.rotate-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.rotate-12{--tw-rotate:12deg!important}.rotate-180{--tw-rotate:180deg!important}.rotate-180,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.rotate-90{--tw-rotate:90deg!important}.scale-105{--tw-scale-x:1.05!important;--tw-scale-y:1.05!important}.scale-105,.scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.scale-110{--tw-scale-x:1.1!important;--tw-scale-y:1.1!important}.scale-50{--tw-scale-x:.5!important;--tw-scale-y:.5!important}.scale-50,.scale-75{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.scale-75{--tw-scale-x:.75!important;--tw-scale-y:.75!important}.scale-90{--tw-scale-x:.9!important;--tw-scale-y:.9!important}.scale-90,.scale-\[0\.6\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.scale-\[0\.6\]{--tw-scale-x:0.6!important;--tw-scale-y:0.6!important}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-pointer{cursor:pointer!important}.cursor-text{cursor:text!important}.select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.resize{resize:both!important}.list-none{list-style-type:none!important}.appearance-none{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))!important}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.flex-row{flex-direction:row!important}.flex-col{flex-direction:column!important}.flex-wrap{flex-wrap:wrap!important}.items-start{align-items:flex-start!important}.items-end{align-items:flex-end!important}.items-center{align-items:center!important}.justify-start{justify-content:flex-start!important}.justify-end{justify-content:flex-end!important}.justify-center{justify-content:center!important}.justify-between{justify-content:space-between!important}.justify-items-center{justify-items:center!important}.gap-2{gap:.5rem!important}.gap-3{gap:.75rem!important}.gap-4{gap:1rem!important}.gap-8{gap:2rem!important}.gap-x-4{-moz-column-gap:1rem!important;column-gap:1rem!important}.gap-y-2{row-gap:.5rem!important}.gap-y-3{row-gap:.75rem!important}.gap-y-4{row-gap:1rem!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.whitespace-normal{white-space:normal!important}.whitespace-nowrap{white-space:nowrap!important}.break-words{overflow-wrap:break-word!important}.rounded,.rounded-1{border-radius:.25rem!important}.rounded-1\.4{border-radius:.35rem!important}.rounded-10{border-radius:2.5rem!important}.rounded-2xl{border-radius:1rem!important}.rounded-circle{border-radius:50%!important}.rounded-full{border-radius:9999px!important}.rounded-lg{border-radius:.5rem!important}.rounded-none{border-radius:0!important}.rounded-xl{border-radius:.75rem!important}.rounded-b{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-b-lg{border-bottom-left-radius:.5rem!important}.rounded-b-lg,.rounded-r-lg{border-bottom-right-radius:.5rem!important}.rounded-r-lg{border-top-right-radius:.5rem!important}.rounded-t{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-t-2xl{border-top-left-radius:1rem!important;border-top-right-radius:1rem!important}.rounded-t-lg{border-top-left-radius:.5rem!important;border-top-right-radius:.5rem!important}.border{border-width:1px!important}.border-0{border-width:0!important}.border-2{border-width:2px!important}.border-b{border-bottom-width:1px!important}.border-b-0{border-bottom-width:0!important}.border-l{border-left-width:1px!important}.border-r{border-right-width:1px!important}.border-t{border-top-width:1px!important}.border-solid{border-style:solid!important}.border-dashed{border-style:dashed!important}.border-gray-100{--tw-border-opacity:1!important;border-color:rgb(235 239 244/var(--tw-border-opacity))!important}.border-gray-100\/50{border-color:#ebeff480!important}.border-gray-200{--tw-border-opacity:1!important;border-color:rgb(233 236 239/var(--tw-border-opacity))!important}.border-gray-300{--tw-border-opacity:1!important;border-color:rgb(210 214 218/var(--tw-border-opacity))!important}.border-gray-400{--tw-border-opacity:1!important;border-color:rgb(206 212 218/var(--tw-border-opacity))!important}.border-gray-700{--tw-border-opacity:1!important;border-color:rgb(73 80 87/var(--tw-border-opacity))!important}.border-primary{--tw-border-opacity:1!important;border-color:rgb(11 85 119/var(--tw-border-opacity))!important}.bg-blue-500{--tw-bg-opacity:1!important;background-color:rgb(94 114 228/var(--tw-bg-opacity))!important}.bg-emerald-500{--tw-bg-opacity:1!important;background-color:rgb(45 206 137/var(--tw-bg-opacity))!important}.bg-emerald-500\/80{background-color:#2dce89cc!important}.bg-gray-100{background-color:rgb(235 239 244/var(--tw-bg-opacity))!important}.bg-gray-100,.bg-gray-200{--tw-bg-opacity:1!important}.bg-gray-200{background-color:rgb(233 236 239/var(--tw-bg-opacity))!important}.bg-gray-300{background-color:rgb(210 214 218/var(--tw-bg-opacity))!important}.bg-gray-300,.bg-gray-50{--tw-bg-opacity:1!important}.bg-gray-50{background-color:rgb(248 249 250/var(--tw-bg-opacity))!important}.bg-gray-500{--tw-bg-opacity:1!important;background-color:rgb(173 181 189/var(--tw-bg-opacity))!important}.bg-gray-500\/80{background-color:#adb5bdcc!important}.bg-gray-600{--tw-bg-opacity:1!important;background-color:rgb(108 117 125/var(--tw-bg-opacity))!important}.bg-gray-600\/50{background-color:#6c757d80!important}.bg-gray-600\/80{background-color:#6c757dcc!important}.bg-green-500{--tw-bg-opacity:1!important;background-color:rgb(34 197 94/var(--tw-bg-opacity))!important}.bg-green-500\/80{background-color:#22c55ecc!important}.bg-orange-500{--tw-bg-opacity:1!important;background-color:rgb(251 99 64/var(--tw-bg-opacity))!important}.bg-orange-500\/80{background-color:#fb6340cc!important}.bg-primary{--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important}.bg-primary\/10{background-color:#0b55771a!important}.bg-red-500{--tw-bg-opacity:1!important;background-color:rgb(245 57 57/var(--tw-bg-opacity))!important}.bg-red-500\/80{background-color:#f53939cc!important}.bg-secondary{background-color:rgb(46 172 104/var(--tw-bg-opacity))!important}.bg-secondary,.bg-sky-500{--tw-bg-opacity:1!important}.bg-sky-500{background-color:rgb(14 165 233/var(--tw-bg-opacity))!important}.bg-sky-500\/80{background-color:#0ea5e9cc!important}.bg-slate-800\/10{background-color:#3a416f1a!important}.bg-transparent{background-color:initial!important}.bg-white{background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.bg-white,.bg-yellow-400{--tw-bg-opacity:1!important}.bg-yellow-400{background-color:rgb(251 207 51/var(--tw-bg-opacity))!important}.bg-yellow-400\/80{background-color:#fbcf33cc!important}.bg-yellow-500{--tw-bg-opacity:1!important;background-color:rgb(251 177 64/var(--tw-bg-opacity))!important}.bg-yellow-500\/80{background-color:#fbb140cc!important}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))!important}.bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))!important}.bg-none{background-image:none!important}.from-\[\#075577\]{--tw-gradient-from:#075577 var(--tw-gradient-from-position)!important;--tw-gradient-to:#07557700 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.from-\[\#0b5577\]{--tw-gradient-from:#0b5577 var(--tw-gradient-from-position)!important;--tw-gradient-to:#0b557700 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.from-transparent{--tw-gradient-from:#0000 var(--tw-gradient-from-position)!important;--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.via-black\/40{--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),#0006 var(--tw-gradient-via-position),var(--tw-gradient-to)!important}.to-\[\#116D70\]{--tw-gradient-to:#116d70 var(--tw-gradient-to-position)!important}.to-transparent{--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important}.bg-150{background-size:150%!important}.bg-contain{background-size:contain!important}.bg-clip-border{background-clip:initial!important}.bg-clip-padding{background-clip:padding-box!important}.bg-center{background-position:50%!important}.bg-left{background-position:0!important}.bg-x-25{background-position:25% 0!important}.bg-no-repeat{background-repeat:no-repeat!important}.fill-blue-500{fill:#5e72e4!important}.fill-gray-500{fill:#adb5bd!important}.fill-gray-600{fill:#6c757d!important}.fill-gray-700{fill:#495057!important}.fill-green-500{fill:#22c55e!important}.fill-primary{fill:#0b5577!important}.fill-red-500{fill:#f53939!important}.fill-sky-500{fill:#0ea5e9!important}.fill-slate-800{fill:#3a416f!important}.fill-white{fill:#fff!important}.fill-yellow-500{fill:#fbb140!important}.stroke-amber-500{stroke:#f59e0b!important}.stroke-blue-400{stroke:#60a5fa!important}.stroke-blue-500{stroke:#5e72e4!important}.stroke-emerald-600{stroke:#059669!important}.stroke-gray-100{stroke:#ebeff4!important}.stroke-gray-100\/50{stroke:#ebeff480!important}.stroke-gray-600{stroke:#6c757d!important}.stroke-gray-700{stroke:#495057!important}.stroke-gray-800{stroke:#252f40!important}.stroke-green-700{stroke:#15803d!important}.stroke-orange-500{stroke:#fb6340!important}.stroke-pink-600{stroke:#db2777!important}.stroke-red-500{stroke:#f53939!important}.stroke-sky-500{stroke:#0ea5e9!important}.stroke-stone-500{stroke:#78716c!important}.stroke-white{stroke:#fff!important}.stroke-yellow-400{stroke:#fbcf33!important}.stroke-yellow-500{stroke:#fbb140!important}.stroke-0{stroke-width:0!important}.object-cover{-o-object-fit:cover!important;object-fit:cover!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:.75rem!important}.p-4{padding:1rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-0\.5{padding-left:.125rem!important;padding-right:.125rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-1\.5{padding-left:.375rem!important;padding-right:.375rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-28{padding-left:7rem!important;padding-right:7rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-8{padding-left:2rem!important;padding-right:2rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-0\.5{padding-top:.125rem!important;padding-bottom:.125rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-1\.5{padding-top:.375rem!important;padding-bottom:.375rem!important}.py-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-2\.5{padding-top:.625rem!important;padding-bottom:.625rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-8{padding-top:2rem!important;padding-bottom:2rem!important}.pb-0{padding-bottom:0!important}.pb-10{padding-bottom:2.5rem!important}.pb-16{padding-bottom:4rem!important}.pb-2{padding-bottom:.5rem!important}.pb-24{padding-bottom:6rem!important}.pb-28{padding-bottom:7rem!important}.pb-4{padding-bottom:1rem!important}.pb-6{padding-bottom:1.5rem!important}.pb-8{padding-bottom:2rem!important}.pl-0{padding-left:0!important}.pl-2{padding-left:.5rem!important}.pl-3{padding-left:.75rem!important}.pl-6{padding-left:1.5rem!important}.pt-1{padding-top:.25rem!important}.pt-10{padding-top:2.5rem!important}.pt-2{padding-top:.5rem!important}.pt-20{padding-top:5rem!important}.pt-3{padding-top:.75rem!important}.pt-4{padding-top:1rem!important}.pt-6{padding-top:1.5rem!important}.pt-8{padding-top:2rem!important}.pt-9{padding-top:2.25rem!important}.text-left{text-align:left!important}.text-center{text-align:center!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.font-sans{font-family:Open Sans!important}.text-2xl{font-size:1.5rem!important;line-height:2rem!important}.text-3xl{font-size:1.875rem!important;line-height:2.25rem!important}.text-4xl{font-size:2.25rem!important;line-height:2.5rem!important}.text-5xl{font-size:3rem!important}.text-5xl,.text-6xl{line-height:1!important}.text-6xl{font-size:3.75rem!important}.text-7xl{font-size:4.5rem!important}.text-7xl,.text-9xl{line-height:1!important}.text-9xl{font-size:6rem!important}.text-\[0\.7rem\]{font-size:.7rem!important}.text-\[1\.1rem\]{font-size:1.1rem!important}.text-base{font-size:1rem!important;line-height:1.5rem!important}.text-lg{font-size:1.125rem!important;line-height:1.75rem!important}.text-sm{font-size:.875rem!important;line-height:1.5rem!important}.text-xl{font-size:1.25rem!important;line-height:1.75rem!important}.text-xs{font-size:.75rem!important;line-height:1rem!important}.font-bold{font-weight:700!important}.font-medium{font-weight:500!important}.font-normal{font-weight:400!important}.font-semibold{font-weight:600!important}.uppercase{text-transform:uppercase!important}.capitalize{text-transform:capitalize!important}.italic{font-style:italic!important}.ordinal{--tw-ordinal:ordinal!important;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)!important}.leading-5{line-height:1.25rem!important}.leading-5\.6{line-height:1.4rem!important}.leading-6{line-height:1.5rem!important}.leading-default{line-height:1.6!important}.leading-none{line-height:1!important}.leading-normal{line-height:1.5!important}.leading-tight{line-height:1.25!important}.tracking-\[0\.20rem\]{letter-spacing:.2rem!important}.tracking-normal{letter-spacing:0!important}.tracking-tight-rem{letter-spacing:-.025rem!important}.tracking-wide{letter-spacing:.025em!important}.tracking-wider{letter-spacing:.05em!important}.tracking-widest{letter-spacing:.1em!important}.text-blue-500{--tw-text-opacity:1!important;color:rgb(94 114 228/var(--tw-text-opacity))!important}.text-gray-100{--tw-text-opacity:1!important;color:rgb(235 239 244/var(--tw-text-opacity))!important}.text-gray-100\/50{color:#ebeff480!important}.text-gray-300{--tw-text-opacity:1!important;color:rgb(210 214 218/var(--tw-text-opacity))!important}.text-gray-50{--tw-text-opacity:1!important;color:rgb(248 249 250/var(--tw-text-opacity))!important}.text-gray-500{--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}.text-gray-600{--tw-text-opacity:1!important;color:rgb(108 117 125/var(--tw-text-opacity))!important}.text-gray-700{--tw-text-opacity:1!important;color:rgb(73 80 87/var(--tw-text-opacity))!important}.text-gray-700\/80{color:#495057cc!important}.text-gray-800{--tw-text-opacity:1!important;color:rgb(37 47 64/var(--tw-text-opacity))!important}.text-green-500{--tw-text-opacity:1!important;color:rgb(34 197 94/var(--tw-text-opacity))!important}.text-primary{color:rgb(11 85 119/var(--tw-text-opacity))!important}.text-primary,.text-red-500{--tw-text-opacity:1!important}.text-red-500{color:rgb(245 57 57/var(--tw-text-opacity))!important}.text-secondary{--tw-text-opacity:1!important;color:rgb(46 172 104/var(--tw-text-opacity))!important}.text-slate-500{--tw-text-opacity:1!important;color:rgb(103 116 142/var(--tw-text-opacity))!important}.text-slate-700{color:rgb(52 71 103/var(--tw-text-opacity))!important}.text-slate-700,.text-white{--tw-text-opacity:1!important}.text-white{color:rgb(255 255 255/var(--tw-text-opacity))!important}.text-yellow-400{--tw-text-opacity:1!important;color:rgb(251 207 51/var(--tw-text-opacity))!important}.text-yellow-500{--tw-text-opacity:1!important;color:rgb(251 177 64/var(--tw-text-opacity))!important}.underline{text-decoration-line:underline!important}.antialiased{-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.opacity-0{opacity:0!important}.opacity-100{opacity:1!important}.opacity-50{opacity:.5!important}.opacity-60{opacity:.6!important}.opacity-80{opacity:.8!important}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.shadow,.shadow-3xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-3xl{--tw-shadow:0 8px 26px -4px #14141426,0 8px 9px -5px #1414140f!important;--tw-shadow-colored:0 8px 26px -4px var(--tw-shadow-color),0 8px 9px -5px var(--tw-shadow-color)!important}.shadow-\[8px_8px_12px_rgb\(0\2c 0\2c 0\2c 0\.2\)\]{--tw-shadow:8px 8px 12px #0003!important;--tw-shadow-colored:8px 8px 12px var(--tw-shadow-color)!important}.shadow-\[8px_8px_12px_rgb\(0\2c 0\2c 0\2c 0\.2\)\],.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-md{--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014!important;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)!important}.shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.shadow-none,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-sm{--tw-shadow:0 .25rem .375rem -.0625rem #1414141f,0 .125rem .25rem -.0625rem #14141412!important;--tw-shadow-colored:0 .25rem .375rem -.0625rem var(--tw-shadow-color),0 .125rem .25rem -.0625rem var(--tw-shadow-color)!important}.shadow-xl{--tw-shadow:0 0 2rem 0 #8898aa26!important;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color)!important}.shadow-xl,.shadow-xs{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-xs{--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014!important;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color)!important}.outline-none{outline:2px solid #0000!important;outline-offset:2px!important}.outline{outline-style:solid!important}.outline-secondary{outline-color:#2eac68!important}.blur{--tw-blur:blur(8px)!important}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter!important;transition-timing-function:ease!important;transition-duration:.15s!important}.transition-all{transition-property:all!important;transition-timing-function:ease!important;transition-duration:.15s!important}.transition-transform{transition-property:transform!important;transition-timing-function:ease!important;transition-duration:.15s!important}.delay-200{transition-delay:.2s!important}.duration-200{transition-duration:.2s!important}.duration-250{transition-duration:.25s!important}.duration-300{transition-duration:.3s!important}.duration-700{transition-duration:.7s!important}.ease-in{transition-timing-function:ease-in!important}.ease-in-out{transition-timing-function:ease-in-out!important}.flex-wrap-inherit{flex-wrap:inherit!important}@font-face{font-family:Open Sans;src:url(../webfonts/OpenSans.ttf)}*{font-family:Open Sans,sans-serif}.ace_editor,.ace_editor *{font-family:Monaco,Menlo,Ubuntu Mono,Droid Sans Mono,Consolas,monospace!important;font-weight:400!important;letter-spacing:0!important}.sr-only{display:none}.separator{margin:.75rem 0 .5rem;height:1px;background-color:initial;--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to);--tw-gradient-stops:var(--tw-gradient-from),#0006 var(--tw-gradient-via-position),var(--tw-gradient-to);--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.separator,:is(.dark .separator){background-image:linear-gradient(to right,var(--tw-gradient-stops))}:is(.dark .separator){--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#fff var(--tw-gradient-via-position),var(--tw-gradient-to);--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.close-btn{display:inline-block;cursor:pointer;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(245 57 57/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(245 57 57/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.close-btn,.close-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.close-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.close-btn:focus,.close-btn:hover{background-color:#fffc}.close-btn:active{opacity:.85}.close-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.close-btn:disabled,.close-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.close-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .close-btn){--tw-bg-opacity:1;background-color:rgb(233 236 239/var(--tw-bg-opacity));--tw-brightness:brightness(.9)}:is(.dark .close-btn),:is(.dark .close-btn:hover){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .close-btn:hover){--tw-brightness:brightness(.75)}:is(.dark .close-btn:disabled){--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .close-btn:disabled),:is(.dark .close-btn:hover:disabled){border-color:#49505700;background-color:rgb(73 80 87/var(--tw-bg-opacity))}:is(.dark .close-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}@media (min-width:768px){.close-btn{padding:.625rem 1.25rem}}.valid-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.valid-btn,.valid-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.valid-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.valid-btn:focus,.valid-btn:hover{background-color:#22c55ecc}.valid-btn:active{opacity:.85}.valid-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.valid-btn:disabled,.valid-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.valid-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .valid-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .valid-btn:disabled){--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .valid-btn:disabled),:is(.dark .valid-btn:hover:disabled){border-color:#49505700;background-color:rgb(73 80 87/var(--tw-bg-opacity))}:is(.dark .valid-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}@media (min-width:768px){.valid-btn{padding:.625rem 1.25rem}}.delete-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(245 57 57/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.delete-btn,.delete-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.delete-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.delete-btn:focus,.delete-btn:hover{background-color:#f53939cc}.delete-btn:active{opacity:.85}.delete-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.delete-btn:disabled,.delete-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.delete-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .delete-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .delete-btn:disabled){border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .delete-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity))}@media (min-width:768px){.delete-btn{padding:.625rem 1.25rem}}.edit-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(251 177 64/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.edit-btn,.edit-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.edit-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.edit-btn:focus,.edit-btn:hover{background-color:#fbb140cc}.edit-btn:active{opacity:.85}.edit-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.edit-btn:disabled,.edit-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.edit-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .edit-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .edit-btn:disabled){--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .edit-btn:disabled),:is(.dark .edit-btn:hover:disabled){border-color:#49505700;background-color:rgb(73 80 87/var(--tw-bg-opacity))}:is(.dark .edit-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}@media (min-width:768px){.edit-btn{padding:.625rem 1.25rem}}.info-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.info-btn,.info-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.info-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.info-btn:focus,.info-btn:hover{background-color:#0ea5e9cc}.info-btn:active{opacity:.85}.info-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.info-btn:disabled,.info-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.info-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .info-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .info-btn:disabled){--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .info-btn:disabled),:is(.dark .info-btn:hover:disabled){border-color:#49505700;background-color:rgb(73 80 87/var(--tw-bg-opacity))}:is(.dark .info-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}@media (min-width:768px){.info-btn{padding:.625rem 1.25rem}}.checkbox{position:relative;z-index:10;float:left;margin-top:.25rem;height:1.25rem;width:1.25rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.35rem;border-width:1px;border-color:rgb(210 214 218/var(--tw-border-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));background-size:contain;background-position:50%;background-repeat:no-repeat;vertical-align:top;font-size:1rem;line-height:1.5rem;transition-property:all;transition-timing-function:ease;transition-duration:.25s}.checkbox,.checkbox:disabled{--tw-border-opacity:1;--tw-bg-opacity:1}.checkbox:disabled{cursor:default;border-color:rgb(206 212 218/var(--tw-border-opacity));background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.checkbox[data-checked=true]{z-index:0;--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity))}.checkbox:disabled[data-checked=true]{--tw-border-opacity:1;border-color:rgb(206 212 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}:is(.dark .checkbox){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity))}:is(.dark .checkbox:disabled){--tw-border-opacity:1;border-color:rgb(37 47 64/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 47 64/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .checkbox[data-checked=true]){--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity))}:is(.dark .checkbox:disabled[data-checked=true]){--tw-border-opacity:1;border-color:rgb(37 47 64/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 47 64/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}.custom-select-btn{display:flex;width:100%;align-items:center;justify-content:space-between;border-radius:.5rem;border-width:1px;border-style:solid;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:padding-box;padding:.25rem .375rem;text-align:left;vertical-align:middle;font-size:.875rem;font-weight:400;line-height:1.4rem;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}.custom-select-btn::-moz-placeholder{--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.custom-select-btn::placeholder{--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.custom-select-btn:focus{--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity))}.custom-select-btn:disabled{--tw-border-opacity:1;border-color:rgb(206 212 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));opacity:.75}:is(.dark .custom-select-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .custom-select-btn:disabled){--tw-border-opacity:1;border-color:rgb(37 47 64/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 47 64/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}@media (min-width:768px){.custom-select-btn{padding:.5rem .75rem}}.custom-dropdown-btn{position:relative;margin-top:0;margin-bottom:0;min-height:38px;cursor:pointer;border-radius:0;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.5rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.custom-dropdown-btn:hover{--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .custom-dropdown-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}.active.custom-dropdown-btn{position:relative;margin-top:0;margin-bottom:0;min-height:38px;cursor:pointer;border-radius:0;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity));padding:.5rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.active.custom-dropdown-btn:hover{--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .active.custom-dropdown-btn){border-color:rgb(98 117 148/var(--tw-border-opacity));background-color:rgb(11 85 119/var(--tw-bg-opacity));color:rgb(233 236 239/var(--tw-text-opacity))}.regular-input,:is(.dark .active.custom-dropdown-btn){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1}.regular-input{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.5rem;border-width:1px;border-style:solid;border-color:rgb(210 214 218/var(--tw-border-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:padding-box;padding:.25rem .375rem;font-size:.875rem;font-weight:400;line-height:1.4rem;color:rgb(73 80 87/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px;transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.regular-input::-moz-placeholder{--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.regular-input::placeholder{--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.regular-input:focus{border-color:#d2d6da00;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.regular-input:valid:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.regular-input:invalid:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(245 57 57/var(--tw-ring-opacity))}.regular-input:disabled{--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));opacity:.75}:is(.dark .regular-input){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .regular-input:disabled){--tw-border-opacity:1;border-color:rgb(37 47 64/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 47 64/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}@media (min-width:768px){.regular-input{padding:.5rem .75rem}}.invalid.regular-input{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important;--tw-ring-opacity:1!important;--tw-ring-color:rgb(245 57 57/var(--tw-ring-opacity))!important}.input-title{margin:0;font-size:.875rem;line-height:1.5rem;font-weight:700;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .input-title){--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}.popover-settings-container{position:fixed;z-index:1000;height:-moz-fit-content;height:fit-content;max-width:250px;--tw-translate-y:-1.75rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:.375rem;--tw-bg-opacity:1;background-color:rgb(94 114 228/var(--tw-bg-opacity));padding:.75rem;transition-property:all;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.5s}:is(.dark .popover-settings-container){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.popover-tab{position:absolute;left:0;bottom:0;z-index:50;--tw-translate-y:-1.75rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:.375rem;--tw-bg-opacity:1;background-color:rgb(94 114 228/var(--tw-bg-opacity));padding:.75rem;transition-property:all;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.5s}:is(.dark .popover-tab){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.popover-settings-text{margin:0;font-size:.875rem;line-height:1.5rem;font-weight:700;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}.popover-settings-text,:is(.dark .popover-settings-text){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.popover-settings-svg{margin-left:.5rem;height:1.25rem;width:1.25rem;cursor:pointer;fill:#5e72e4}.popover-settings-svg:hover{--tw-brightness:brightness(.75);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.popover-settings-svg-multiple{margin-left:.5rem;height:1.375rem;width:1.375rem;cursor:pointer;fill:#fb6340;stroke:#495057}.popover-settings-svg-multiple:hover{--tw-brightness:brightness(.75);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .popover-settings-svg-multiple){stroke:#adb5bd}.hidden-multiple{display:none!important}.active.tabs-tab-btn,.active.tabs-tab-btn:hover{--tw-bg-opacity:1;background-color:rgb(233 236 239/var(--tw-bg-opacity))}:is(.dark .active.tabs-tab-btn),:is(.dark .active.tabs-tab-btn:hover){--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity))}.tabs-tab-btn{position:relative;margin-top:.25rem;margin-bottom:.25rem;cursor:pointer;border-radius:0;border-width:1px;--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.75rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:-.025rem;--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.tabs-tab-btn,.tabs-tab-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.tabs-tab-btn:hover{--tw-bg-opacity:1;background-color:rgb(235 239 244/var(--tw-bg-opacity));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}:is(.dark .tabs-tab-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity))}:is(.dark .tabs-tab-btn:hover){--tw-bg-opacity:1;background-color:rgb(58 65 111/var(--tw-bg-opacity))}.tabs-name{padding-left:.75rem;padding-right:.5rem;--tw-text-opacity:1;color:rgb(11 85 119/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .tabs-name){--tw-text-opacity:1;color:rgb(235 239 244/var(--tw-text-opacity))}.tabs-popover-container{position:absolute;top:60px;left:0;z-index:50;min-width:150px;border-radius:.375rem;--tw-bg-opacity:1;background-color:rgb(94 114 228/var(--tw-bg-opacity));padding:.75rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}:is(.dark .tabs-popover-container){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.tabs-popover-text{margin:0;font-size:.875rem;line-height:1.5rem;font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.settings-tabs-select-btn{margin-top:.25rem;margin-bottom:.25rem;display:flex;width:100%;cursor:pointer;align-items:center;justify-content:space-between;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:-.025rem;--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.settings-tabs-select-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1;background-color:rgb(248 249 250/var(--tw-bg-opacity));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .settings-tabs-select-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity))}:is(.dark .settings-tabs-select-btn:hover){--tw-brightness:brightness(.95);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:768px){.settings-tabs-select-btn{padding:.75rem 1.5rem}}.settings-tabs-select-btn-text{--tw-text-opacity:1;color:rgb(11 85 119/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .settings-tabs-select-btn-text){--tw-text-opacity:1;color:rgb(206 212 218/var(--tw-text-opacity))}.active.settings-tabs-select-dropdown-btn{position:relative;z-index:1000;margin-top:0;margin-bottom:0;cursor:pointer;border-radius:0;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity));padding:.5rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.active.settings-tabs-select-dropdown-btn:hover{--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .active.settings-tabs-select-dropdown-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .active.settings-tabs-select-dropdown-btn:hover){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.first.settings-tabs-select-dropdown-btn{border-top-left-radius:.25rem;border-top-right-radius:.25rem;border-width:1px}.last.settings-tabs-select-dropdown-btn{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.settings-tabs-select-dropdown-btn{position:relative;margin-top:0;margin-bottom:0;display:flex;cursor:pointer;justify-content:space-between;border-radius:0;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.5rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.settings-tabs-select-dropdown-btn:hover{--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .settings-tabs-select-dropdown-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .settings-tabs-select-dropdown-btn:hover){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.home-card{grid-column:span 12/span 12;display:flex;width:100%;justify-content:space-between;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.home-card:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .home-card){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:576px){.home-card{max-height:7rem}}@media (min-width:768px){.home-card{grid-column:span 6/span 6}}@media (min-width:1320px){.home-card{grid-column:span 4/span 4}}.home-card-name{margin-bottom:0;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;font-weight:600;text-transform:uppercase;line-height:1.5}:is(.dark .home-card-name){--tw-text-opacity:1;color:rgb(206 212 218/var(--tw-text-opacity))}.home-card-title{margin-bottom:.25rem;font-weight:700}:is(.dark .home-card-title){color:#ffffffe6}.home-card-subtitle{margin-left:.125rem;margin-right:.125rem;margin-bottom:0;font-size:.875rem;line-height:1.5rem;font-weight:700;line-height:1.5}.info.home-card-subtitle{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.error.home-card-subtitle{--tw-text-opacity:1;color:rgb(245 57 57/var(--tw-text-opacity))}.success.home-card-subtitle{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.warning.home-card-subtitle{--tw-text-opacity:1;color:rgb(251 177 64/var(--tw-text-opacity))}.home-card-svg-container{display:inline-block;height:3rem;width:3rem;border-radius:50%;text-align:center}:is(.dark .home-card-svg-container){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.version.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(251 177 64/var(--tw-bg-opacity))}.version-number.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(45 206 137/var(--tw-bg-opacity))}.instances.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(108 117 125/var(--tw-bg-opacity))}.services.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(251 99 64/var(--tw-bg-opacity))}.plugins.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(251 207 51/var(--tw-bg-opacity))}.card-detail-container{margin-top:1rem;margin-bottom:1.5rem;margin-left:.25rem;display:grid;grid-template-columns:repeat(1,minmax(0,1fr));gap:.5rem}.card-detail-item{grid-column:span 1/span 1;display:flex;align-items:center;padding-top:.25rem;padding-bottom:.25rem}@media (min-width:576px){.card-detail-item{padding-top:0;padding-bottom:0}}.card-detail-item-title{margin-bottom:0;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .card-detail-item-title){--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.card-detail-item-subtitle{grid-column:span 1/span 1;margin-bottom:0;word-break:break-all;padding-left:.5rem;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;font-weight:600;text-transform:uppercase;line-height:1.5;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .card-detail-item-subtitle){--tw-text-opacity:1;color:rgb(235 239 244/var(--tw-text-opacity))}.core-layout{grid-column:span 12/span 12;display:grid;grid-template-columns:repeat(12,minmax(0,1fr))}.core-card{position:relative;grid-column:span 12/span 12;margin:.5rem;height:-moz-fit-content;height:fit-content;min-width:0;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.core-card:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .core-card){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:768px){.core-card{grid-column:span 6/span 6}}@media (min-width:1320px){.core-card{grid-column:span 4/span 4}}@media (min-width:1920px){.core-card{grid-column:span 3/span 3}}.core-card-lg{position:relative;grid-column:span 12/span 12;margin:.5rem;height:-moz-fit-content;height:fit-content;min-width:0;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.core-card-lg:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .core-card-lg){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:768px){.core-card-lg{grid-column:span 6/span 6}}.core-card-wrap{display:flex;justify-content:space-between}.core-card-wrap-logo{display:flex;align-items:center;justify-content:flex-start}.core-card-text{margin-bottom:0;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;line-height:1.5;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .core-card-text){--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}.center.core-card-text{text-align:center}.core-card-title{margin-bottom:.5rem;font-weight:700}:is(.dark .core-card-title){color:#ffffffe6}.core-card-svg-container{display:inline-block;height:3rem;width:3rem;border-radius:50%;text-align:center}:is(.dark .core-card-svg-container){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.core-card-deactivated-title{font-weight:700}:is(.dark .core-card-deactivated-title){color:#ffffffe6}.core-card-deactivated-svg{position:relative;fill:#fbb140;stroke:#fff;font-size:1.125rem;line-height:1.75rem;line-height:1}.core-card-text-container{margin:.75rem .25rem;display:flex;align-items:center;justify-content:flex-start}.core-card-status{position:relative;grid-column:span 12/span 12;margin:.5rem;height:-moz-fit-content;height:fit-content;width:-moz-fit-content;width:fit-content;min-width:0;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.core-card-status:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .core-card-status){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:768px){.core-card-status{grid-column:span 6/span 6}}@media (min-width:1320px){.core-card-status{grid-column:span 3/span 3}}@media (min-width:1920px){.core-card-status{grid-column:span 2/span 2}}.core-card-status-container{margin-left:.25rem;margin-right:.25rem;display:flex;align-items:center;justify-content:flex-start}.core-card-status-title{margin-bottom:0;margin-right:1rem;font-weight:700}:is(.dark .core-card-status-title){color:#ffffffe6}.core-card-status-svg{height:1.5rem;width:1.5rem}.info.core-card-status-svg{fill:#0ea5e9}.error.core-card-status-svg{fill:#f53939}.success.core-card-status-svg{fill:#22c55e}.core-layout-separator{grid-column:span 12/span 12}.core-card-list{position:relative;grid-column:span 12/span 12;margin:.5rem;display:grid;height:-moz-fit-content;height:fit-content;max-height:25rem;grid-template-columns:repeat(12,minmax(0,1fr));align-content:flex-start;overflow-y:auto;overflow-x:hidden;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color)}.core-card-list,:is(.dark .core-card-list){box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .core-card-list){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:576px){.core-card-list{max-height:31.25rem}}@media (min-width:768px){.core-card-list{grid-column:span 6/span 6}.w-small.core-card-list{max-width:300px}.w-medium.core-card-list{max-width:400px}.w-large.core-card-list{max-width:550px}}.core-card-list-title-container{grid-column:span 12/span 12;display:flex}.core-card-list-title{margin:.5rem .5rem 1rem;font-weight:700}:is(.dark .core-card-list-title){color:#ffffffe6}.core-card-list-container{grid-column:span 12/span 12;overflow-x:auto;overflow-y:auto}.core-card-list-header{margin:0;height:2rem;border-bottom-width:1px;--tw-border-opacity:1;border-color:rgb(206 212 218/var(--tw-border-opacity));padding-bottom:.5rem;font-size:.875rem;line-height:1.5rem;font-weight:700}:is(.dark .core-card-list-header){--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}.core-card-list-item{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));align-items:center;border-bottom-width:1px;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));padding-top:.625rem;padding-bottom:.625rem}.core-card-list-item-content{margin:.25rem 0;font-size:.875rem;line-height:1.5rem}:is(.dark .core-card-list-item-content){--tw-text-opacity:1;color:rgb(206 212 218/var(--tw-text-opacity))}.core-card-list-wrap{display:grid;width:100%;grid-template-columns:repeat(12,minmax(0,1fr));border-radius:.25rem;padding:.5rem}.w-small.core-card-list-wrap{min-width:200px}.w-medium.core-card-list-wrap{min-width:300px}.w-large.core-card-list-wrap{min-width:450px}.core-card-metrics{grid-column:span 12/span 12;margin:.5rem;display:flex;height:-moz-fit-content;height:fit-content;justify-content:space-between;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.core-card-metrics:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .core-card-metrics){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:576px){.core-card-metrics{max-height:7rem}}@media (min-width:768px){.core-card-metrics{grid-column:span 6/span 6}}@media (min-width:1320px){.core-card-metrics{grid-column:span 4/span 4}}.core-card-metrics-name{margin-bottom:.5rem;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;font-weight:600;text-transform:uppercase;line-height:1.5}:is(.dark .core-card-metrics-name){--tw-text-opacity:1;color:rgb(206 212 218/var(--tw-text-opacity))}.core-card-metrics-subtitle{margin-bottom:0}:is(.dark .core-card-metrics-subtitle){--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}.core-card-metrics-subtitle-content{margin-left:.125rem;margin-right:.125rem;font-size:.875rem;line-height:1.5rem;font-weight:700;line-height:1.5}.error.core-card-metrics-subtitle-content{--tw-text-opacity:1;color:rgb(245 57 57/var(--tw-text-opacity))}.success.core-card-metrics-subtitle-content{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.warning.core-card-metrics-subtitle-content{--tw-text-opacity:1;color:rgb(251 177 64/var(--tw-text-opacity))}.info.core-card-metrics-subtitle-content{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.core-card-metrics-svg{position:relative;fill:#fff;font-size:1.125rem;line-height:1.75rem;line-height:1}.size-small.core-card-metrics-svg{--tw-scale-x:0.5;--tw-scale-y:0.5}.size-medium.core-card-metrics-svg,.size-small.core-card-metrics-svg{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.size-medium.core-card-metrics-svg{--tw-scale-x:0.6;--tw-scale-y:0.6}.size-base.core-card-metrics-svg{--tw-scale-x:0.75;--tw-scale-y:0.75;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.purple.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.green.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.red.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.orange.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(245 96 54/var(--tw-bg-opacity))}.blue.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(33 82 255/var(--tw-bg-opacity))}.yellow.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.gray.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(108 117 125/var(--tw-bg-opacity))}.dark.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(98 117 148/var(--tw-bg-opacity))}.amber.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.emerald.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.teal.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.indigo.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.cyan.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.sky.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.pink.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.lime.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.core-separator{margin:.75rem 0 .5rem;height:1px;background-color:initial;--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to);--tw-gradient-stops:var(--tw-gradient-from),#0006 var(--tw-gradient-via-position),var(--tw-gradient-to);--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.core-separator,:is(.dark .core-separator){background-image:linear-gradient(to right,var(--tw-gradient-stops))}:is(.dark .core-separator){--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#fff var(--tw-gradient-via-position),var(--tw-gradient-to);--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.core-card-test-container{margin-top:1rem;display:flex;justify-content:center}.core-card-test-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(251 177 64/var(--tw-bg-opacity));padding:.75rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.core-card-test-btn,.core-card-test-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.core-card-test-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));background-color:#fbb140cc;--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.core-card-test-btn:focus{background-color:#fbb140cc}.core-card-test-btn:active{opacity:.85}.core-card-test-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.core-card-test-btn:disabled,.core-card-test-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.core-card-test-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .core-card-test-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .core-card-test-btn:disabled){border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .core-card-test-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity))}.core-card-test-status-container{margin-left:.25rem;margin-right:.25rem;display:flex;align-items:center;justify-content:center}.core-card-test-status-svg{margin-right:.5rem;height:1.5rem;width:1.5rem}.success.core-card-test-status-svg{fill:#22c55e}.error.core-card-test-status-svg{fill:#f53939}.info.core-card-test-status-svg{fill:#0ea5e9}.core-img-default{margin-right:1rem;height:3rem;width:3rem}.core-img-hor{margin-right:1rem;height:4rem;width:6rem}.file-manager-actions-item-btn{position:relative;margin:.25rem;cursor:pointer;white-space:nowrap;border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.75rem 1.25rem .625rem 1rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(11 85 119/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.file-manager-actions-item-btn:hover{--tw-bg-opacity:1;background-color:rgb(235 239 244/var(--tw-bg-opacity));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.file-manager-actions-item-btn:disabled{cursor:not-allowed;border-color:#ced4da00;--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.file-manager-actions-item-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-color:#ced4da00;--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity))}:is(.dark .file-manager-actions-item-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .file-manager-actions-item-btn:hover){--tw-bg-opacity:1;background-color:rgb(58 65 111/var(--tw-bg-opacity))}:is(.dark .file-manager-actions-item-btn:disabled){border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .file-manager-actions-item-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity))}@media (min-width:768px){.file-manager-actions-item-btn{display:block}}.first-letter\:absolute:first-letter{position:absolute!important}.first-letter\:w-full:first-letter{width:100%!important}.placeholder\:text-gray-500::-moz-placeholder{--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}.placeholder\:text-gray-500::placeholder{--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}.before\:float-left:before{content:var(--tw-content)!important;float:left!important}.before\:pr-2:before{content:var(--tw-content)!important;padding-right:.5rem!important}.before\:text-white:before{content:var(--tw-content)!important;--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.before\:content-\[\'\/\'\]:before{--tw-content:"/"!important;content:var(--tw-content)!important}.after\:absolute:after{content:var(--tw-content)!important;position:absolute!important}.after\:top-px:after{content:var(--tw-content)!important;top:1px!important}.after\:float-right:after{content:var(--tw-content)!important;float:right!important}.after\:h-4:after{content:var(--tw-content)!important;height:1rem!important}.after\:w-4:after{content:var(--tw-content)!important;width:1rem!important}.after\:translate-x-px:after{content:var(--tw-content)!important;--tw-translate-x:1px!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.after\:rounded-circle:after{content:var(--tw-content)!important;border-radius:50%!important}.after\:bg-white:after{content:var(--tw-content)!important;--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.after\:pl-2:after{content:var(--tw-content)!important;padding-left:.5rem!important}.after\:text-gray-600:after{content:var(--tw-content)!important;--tw-text-opacity:1!important;color:rgb(108 117 125/var(--tw-text-opacity))!important}.after\:shadow-2xl:after{content:var(--tw-content)!important;--tw-shadow:0 .3125rem .625rem 0 #0000001f!important;--tw-shadow-colored:0 .3125rem .625rem 0 var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.after\:duration-300:after{content:var(--tw-content)!important;transition-duration:.3s!important}.after\:content-\[\'\'\]:after{--tw-content:""!important;content:var(--tw-content)!important}.after\:content-\[\'\/\'\]:after{--tw-content:"/"!important;content:var(--tw-content)!important}.checked\:z-0:checked{z-index:0!important}.checked\:border-primary:checked{--tw-border-opacity:1!important;border-color:rgb(11 85 119/var(--tw-border-opacity))!important}.checked\:bg-primary:checked{--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important}.checked\:bg-none:checked{background-image:none!important}.checked\:bg-right:checked{background-position:100%!important}.checked\:after\:translate-x-5:checked:after{--tw-translate-x:1.25rem!important}.checked\:after\:translate-x-5:checked:after,.checked\:after\:translate-x-5\.3:checked:after{content:var(--tw-content)!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.checked\:after\:translate-x-5\.3:checked:after{--tw-translate-x:1.3rem!important}.valid\:\!border-red-500:valid{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.hover\:-translate-y-0:hover{--tw-translate-y:-0px!important}.hover\:-translate-y-0:hover,.hover\:-translate-y-0\.4:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.hover\:-translate-y-0\.4:hover{--tw-translate-y:-0.1rem!important}.hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem!important}.hover\:-translate-y-0\.5:hover,.hover\:-translate-y-px:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.hover\:-translate-y-px:hover{--tw-translate-y:-1px!important}.hover\:scale-102:hover{--tw-scale-x:1.02!important;--tw-scale-y:1.02!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.hover\:rounded-lg:hover{border-radius:.5rem!important}.hover\:bg-emerald-500:hover{--tw-bg-opacity:1!important;background-color:rgb(45 206 137/var(--tw-bg-opacity))!important}.hover\:bg-emerald-500\/80:hover{background-color:#2dce89cc!important}.hover\:bg-gray-100:hover{--tw-bg-opacity:1!important;background-color:rgb(235 239 244/var(--tw-bg-opacity))!important}.hover\:bg-gray-100\/10:hover{background-color:#ebeff41a!important}.hover\:bg-gray-300:hover{--tw-bg-opacity:1!important;background-color:rgb(210 214 218/var(--tw-bg-opacity))!important}.hover\:bg-gray-500:hover{--tw-bg-opacity:1!important;background-color:rgb(173 181 189/var(--tw-bg-opacity))!important}.hover\:bg-gray-500\/80:hover{background-color:#adb5bdcc!important}.hover\:bg-gray-600:hover{--tw-bg-opacity:1!important;background-color:rgb(108 117 125/var(--tw-bg-opacity))!important}.hover\:bg-gray-600\/80:hover{background-color:#6c757dcc!important}.hover\:bg-green-500:hover{--tw-bg-opacity:1!important;background-color:rgb(34 197 94/var(--tw-bg-opacity))!important}.hover\:bg-green-500\/80:hover{background-color:#22c55ecc!important}.hover\:bg-orange-500:hover{--tw-bg-opacity:1!important;background-color:rgb(251 99 64/var(--tw-bg-opacity))!important}.hover\:bg-orange-500\/80:hover{background-color:#fb6340cc!important}.hover\:bg-primary\/30:hover{background-color:#0b55774d!important}.hover\:bg-primary\/5:hover{background-color:#0b55770d!important}.hover\:bg-primary\/80:hover{background-color:#0b5577cc!important}.hover\:bg-red-500:hover{--tw-bg-opacity:1!important;background-color:rgb(245 57 57/var(--tw-bg-opacity))!important}.hover\:bg-red-500\/80:hover{background-color:#f53939cc!important}.hover\:bg-sky-500:hover{--tw-bg-opacity:1!important;background-color:rgb(14 165 233/var(--tw-bg-opacity))!important}.hover\:bg-sky-500\/80:hover{background-color:#0ea5e9cc!important}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1!important;background-color:rgb(251 207 51/var(--tw-bg-opacity))!important}.hover\:bg-yellow-400\/80:hover{background-color:#fbcf33cc!important}.hover\:bg-yellow-500:hover{--tw-bg-opacity:1!important;background-color:rgb(251 177 64/var(--tw-bg-opacity))!important}.hover\:bg-yellow-500\/80:hover{background-color:#fbb140cc!important}.hover\:italic:hover{font-style:italic!important}.hover\:no-underline:hover{text-decoration-line:none!important}.hover\:opacity-80:hover{opacity:.8!important}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014!important;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.hover\:brightness-75:hover{--tw-brightness:brightness(.75)!important}.hover\:brightness-75:hover,.hover\:brightness-90:hover{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.hover\:brightness-90:hover{--tw-brightness:brightness(.9)!important}.hover\:brightness-95:hover{--tw-brightness:brightness(.95)!important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.focus\:\!border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.focus\:border-green-500:focus{--tw-border-opacity:1!important;border-color:rgb(34 197 94/var(--tw-border-opacity))!important}.focus\:border-primary:focus{--tw-border-opacity:1!important;border-color:rgb(11 85 119/var(--tw-border-opacity))!important}.focus\:bg-emerald-500:focus{--tw-bg-opacity:1!important;background-color:rgb(45 206 137/var(--tw-bg-opacity))!important}.focus\:bg-emerald-500\/80:focus{background-color:#2dce89cc!important}.focus\:bg-gray-500:focus{--tw-bg-opacity:1!important;background-color:rgb(173 181 189/var(--tw-bg-opacity))!important}.focus\:bg-gray-500\/80:focus{background-color:#adb5bdcc!important}.focus\:bg-gray-600:focus{--tw-bg-opacity:1!important;background-color:rgb(108 117 125/var(--tw-bg-opacity))!important}.focus\:bg-gray-600\/80:focus{background-color:#6c757dcc!important}.focus\:bg-green-500:focus{--tw-bg-opacity:1!important;background-color:rgb(34 197 94/var(--tw-bg-opacity))!important}.focus\:bg-green-500\/80:focus{background-color:#22c55ecc!important}.focus\:bg-orange-500:focus{--tw-bg-opacity:1!important;background-color:rgb(251 99 64/var(--tw-bg-opacity))!important}.focus\:bg-orange-500\/80:focus{background-color:#fb6340cc!important}.focus\:bg-primary\/80:focus{background-color:#0b5577cc!important}.focus\:bg-red-500:focus{--tw-bg-opacity:1!important;background-color:rgb(245 57 57/var(--tw-bg-opacity))!important}.focus\:bg-red-500\/80:focus{background-color:#f53939cc!important}.focus\:bg-sky-500:focus{--tw-bg-opacity:1!important;background-color:rgb(14 165 233/var(--tw-bg-opacity))!important}.focus\:bg-sky-500\/80:focus{background-color:#0ea5e9cc!important}.focus\:bg-yellow-400:focus{--tw-bg-opacity:1!important;background-color:rgb(251 207 51/var(--tw-bg-opacity))!important}.focus\:bg-yellow-400\/80:focus{background-color:#fbcf33cc!important}.focus\:bg-yellow-500:focus{--tw-bg-opacity:1!important;background-color:rgb(251 177 64/var(--tw-bg-opacity))!important}.focus\:bg-yellow-500\/80:focus{background-color:#fbb140cc!important}.focus\:outline:focus{outline-style:solid!important}.focus\:\!ring-red-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(245 57 57/var(--tw-ring-opacity))!important}.focus\:valid\:\!border-red-500:valid:focus{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.focus\:valid\:border-green-500:valid:focus{--tw-border-opacity:1!important;border-color:rgb(34 197 94/var(--tw-border-opacity))!important}.focus\:valid\:\!ring-red-500:valid:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(245 57 57/var(--tw-ring-opacity))!important}.focus\:invalid\:border-red-500:invalid:focus{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.focus\:file\:invalid\:border-red-500:invalid::file-selector-button:focus{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.active\:\!border-red-500:active{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.active\:opacity-85:active{opacity:.85!important}.active\:valid\:\!border-red-500:valid:active{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed!important}.disabled\:border-gray-400:disabled{--tw-border-opacity:1!important;border-color:rgb(206 212 218/var(--tw-border-opacity))!important}.disabled\:border-gray-400\/0:disabled{border-color:#ced4da00!important}.disabled\:bg-gray-400:disabled{--tw-bg-opacity:1!important;background-color:rgb(206 212 218/var(--tw-bg-opacity))!important}.disabled\:text-gray-700:disabled{--tw-text-opacity:1!important;color:rgb(73 80 87/var(--tw-text-opacity))!important}.disabled\:opacity-75:disabled{opacity:.75!important}.disabled\:hover\:translate-y-0:hover:disabled{--tw-translate-y:0px!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.disabled\:hover\:border-gray-400\/0:hover:disabled{border-color:#ced4da00!important}.disabled\:hover\:bg-gray-400:hover:disabled{--tw-bg-opacity:1!important;background-color:rgb(206 212 218/var(--tw-bg-opacity))!important}.group:hover .group-hover\:z-10{z-index:10!important}.group:hover .group-hover\:opacity-100{opacity:1!important}:is(.dark .dark\:inline){display:inline!important}:is(.dark .dark\:hidden){display:none!important}:is(.dark .dark\:border-gray-300){--tw-border-opacity:1!important;border-color:rgb(210 214 218/var(--tw-border-opacity))!important}:is(.dark .dark\:border-gray-700){--tw-border-opacity:1!important;border-color:rgb(73 80 87/var(--tw-border-opacity))!important}:is(.dark .dark\:border-slate-600){--tw-border-opacity:1!important;border-color:rgb(98 117 148/var(--tw-border-opacity))!important}:is(.dark .dark\:border-slate-800){--tw-border-opacity:1!important;border-color:rgb(58 65 111/var(--tw-border-opacity))!important}:is(.dark .dark\:border-gray-100){--tw-border-opacity:1!important;border-color:rgb(235 239 244/var(--tw-border-opacity))!important}:is(.dark .dark\:border-gray-200){--tw-border-opacity:1!important;border-color:rgb(233 236 239/var(--tw-border-opacity))!important}:is(.dark .dark\:bg-gray-800){--tw-bg-opacity:1!important;background-color:rgb(37 47 64/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-green-500\/90){background-color:#22c55ee6!important}:is(.dark .dark\:bg-primary){--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-primary\/50){background-color:#0b557780!important}:is(.dark .dark\:bg-red-500\/90){background-color:#f53939e6!important}:is(.dark .dark\:bg-slate-700){--tw-bg-opacity:1!important;background-color:rgb(52 71 103/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-slate-700\/50){background-color:#34476780!important}:is(.dark .dark\:bg-slate-800){--tw-bg-opacity:1!important;background-color:rgb(58 65 111/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-slate-850){--tw-bg-opacity:1!important;background-color:rgb(17 28 68/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-slate-900){--tw-bg-opacity:1!important;background-color:rgb(5 17 57/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-slate-900\/30){background-color:#0511394d!important}:is(.dark .dark\:bg-gray-400){--tw-bg-opacity:1!important;background-color:rgb(206 212 218/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-gradient-to-r){background-image:linear-gradient(to right,var(--tw-gradient-stops))!important}:is(.dark .dark\:from-transparent){--tw-gradient-from:#0000 var(--tw-gradient-from-position)!important;--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}:is(.dark .dark\:via-white){--tw-gradient-to:#fff0 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),#fff var(--tw-gradient-via-position),var(--tw-gradient-to)!important}:is(.dark .dark\:to-transparent){--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important}:is(.dark .dark\:fill-blue-500){fill:#5e72e4!important}:is(.dark .dark\:fill-gray-300){fill:#d2d6da!important}:is(.dark .dark\:fill-gray-500){fill:#adb5bd!important}:is(.dark .dark\:fill-gray-600){fill:#6c757d!important}:is(.dark .dark\:stroke-amber-500){stroke:#f59e0b!important}:is(.dark .dark\:stroke-gray-300){stroke:#d2d6da!important}:is(.dark .dark\:stroke-gray-400){stroke:#ced4da!important}:is(.dark .dark\:stroke-gray-600){stroke:#6c757d!important}:is(.dark .dark\:stroke-red-500){stroke:#f53939!important}:is(.dark .dark\:stroke-white\/90){stroke:#ffffffe6!important}:is(.dark .dark\:text-gray-100){--tw-text-opacity:1!important;color:rgb(235 239 244/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-200){--tw-text-opacity:1!important;color:rgb(233 236 239/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-300){--tw-text-opacity:1!important;color:rgb(210 214 218/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-400){--tw-text-opacity:1!important;color:rgb(206 212 218/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-50){--tw-text-opacity:1!important;color:rgb(248 249 250/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-500){--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}:is(.dark .dark\:text-white){--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}:is(.dark .dark\:text-white\/80){color:#fffc!important}:is(.dark .dark\:text-white\/90){color:#ffffffe6!important}:is(.dark .dark\:opacity-100){opacity:1!important}:is(.dark .dark\:opacity-60){opacity:.6!important}:is(.dark .dark\:opacity-80){opacity:.8!important}:is(.dark .dark\:opacity-90){opacity:.9!important}:is(.dark .dark\:shadow-dark-xl){--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f!important;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color)!important}:is(.dark .dark\:shadow-dark-xl),:is(.dark .dark\:shadow-none){box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}:is(.dark .dark\:shadow-none){--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}:is(.dark .dark\:brightness-110){--tw-brightness:brightness(1.1)!important}:is(.dark .dark\:brightness-110),:is(.dark .dark\:brightness-125){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:brightness-125){--tw-brightness:brightness(1.25)!important}:is(.dark .dark\:brightness-90){--tw-brightness:brightness(.9)!important}:is(.dark .dark\:brightness-90),:is(.dark .dark\:brightness-95){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:brightness-95){--tw-brightness:brightness(.95)!important}:is(.dark .dark\:brightness-\[0\.885\]){--tw-brightness:brightness(0.885)!important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:placeholder\:text-gray-700)::-moz-placeholder{--tw-text-opacity:1!important;color:rgb(73 80 87/var(--tw-text-opacity))!important}:is(.dark .dark\:placeholder\:text-gray-700)::placeholder{--tw-text-opacity:1!important;color:rgb(73 80 87/var(--tw-text-opacity))!important}:is(.dark .dark\:placeholder\:text-gray-600)::-moz-placeholder{--tw-text-opacity:1!important;color:rgb(108 117 125/var(--tw-text-opacity))!important}:is(.dark .dark\:placeholder\:text-gray-600)::placeholder{--tw-text-opacity:1!important;color:rgb(108 117 125/var(--tw-text-opacity))!important}:is(.dark .dark\:after\:text-gray-300):after{content:var(--tw-content)!important;--tw-text-opacity:1!important;color:rgb(210 214 218/var(--tw-text-opacity))!important}:is(.dark .dark\:after\:text-gray-500):after{content:var(--tw-content)!important;--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}:is(.dark .dark\:checked\:border-primary:checked){--tw-border-opacity:1!important;border-color:rgb(11 85 119/var(--tw-border-opacity))!important}:is(.dark .dark\:checked\:bg-primary:checked){--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important}:is(.dark .dark\:hover\:bg-primary\/20:hover){background-color:#0b557733!important}:is(.dark .dark\:hover\:bg-primary\/60:hover){background-color:#0b557799!important}:is(.dark .dark\:hover\:bg-slate-700\/50:hover){background-color:#34476780!important}:is(.dark .dark\:hover\:bg-slate-800:hover){--tw-bg-opacity:1!important;background-color:rgb(58 65 111/var(--tw-bg-opacity))!important}:is(.dark .dark\:hover\:brightness-100:hover){--tw-brightness:brightness(1)!important}:is(.dark .dark\:hover\:brightness-100:hover),:is(.dark .dark\:hover\:brightness-105:hover){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:hover\:brightness-105:hover){--tw-brightness:brightness(1.05)!important}:is(.dark .dark\:hover\:brightness-110:hover){--tw-brightness:brightness(1.1)!important}:is(.dark .dark\:hover\:brightness-110:hover),:is(.dark .dark\:hover\:brightness-90:hover){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:hover\:brightness-90:hover){--tw-brightness:brightness(.9)!important}:is(.dark .dark\:disabled\:border-gray-700\/0:disabled){border-color:#49505700!important}:is(.dark .dark\:disabled\:border-gray-800:disabled){--tw-border-opacity:1!important;border-color:rgb(37 47 64/var(--tw-border-opacity))!important}:is(.dark .dark\:disabled\:bg-gray-700:disabled){--tw-bg-opacity:1!important;background-color:rgb(73 80 87/var(--tw-bg-opacity))!important}:is(.dark .dark\:disabled\:bg-gray-800:disabled){--tw-bg-opacity:1!important;background-color:rgb(37 47 64/var(--tw-bg-opacity))!important}:is(.dark .dark\:disabled\:text-gray-300:disabled){--tw-text-opacity:1!important;color:rgb(210 214 218/var(--tw-text-opacity))!important}:is(.dark .dark\:disabled\:text-gray-400:disabled){--tw-text-opacity:1!important;color:rgb(206 212 218/var(--tw-text-opacity))!important}:is(.dark .dark\:disabled\:hover\:translate-y-0:hover:disabled){--tw-translate-y:0px!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}:is(.dark .dark\:disabled\:hover\:border-gray-700\/0:hover:disabled){border-color:#49505700!important}:is(.dark .dark\:disabled\:hover\:bg-gray-700:hover:disabled){--tw-bg-opacity:1!important;background-color:rgb(73 80 87/var(--tw-bg-opacity))!important}@media (min-width:576px){.sm\:right-24{right:6rem!important}.sm\:right-40{right:10rem!important}.sm\:right-6{right:1.5rem!important}.sm\:top-2{top:.5rem!important}.sm\:top-8{top:2rem!important}.sm\:top-\[4\.5rem\]{top:4.5rem!important}.sm\:col-span-4{grid-column:span 4/span 4!important}.sm\:col-span-6{grid-column:span 6/span 6!important}.sm\:col-start-5{grid-column-start:5!important}.sm\:mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.sm\:mx-6{margin-left:1.5rem!important;margin-right:1.5rem!important}.sm\:my-0{margin-top:0!important;margin-bottom:0!important}.sm\:mb-2{margin-bottom:.5rem!important}.sm\:ml-1{margin-left:.25rem!important}.sm\:ml-4{margin-left:1rem!important}.sm\:mr-16{margin-right:4rem!important}.sm\:block{display:block!important}.sm\:inline{display:inline!important}.sm\:flex{display:flex!important}.sm\:h-10{height:2.5rem!important}.sm\:h-14{height:3.5rem!important}.sm\:h-7{height:1.75rem!important}.sm\:max-h-125{max-height:31.25rem!important}.sm\:w-36{width:9rem!important}.sm\:w-50{width:12.5rem!important}.sm\:w-7{width:1.75rem!important}.sm\:min-w-\[250px\]{min-width:250px!important}.sm\:min-w-\[500px\]{min-width:500px!important}.sm\:max-w-\[350px\]{max-width:350px!important}.sm\:translate-x-0{--tw-translate-x:0px!important}.sm\:scale-100,.sm\:translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.sm\:flex-row{flex-direction:row!important}.sm\:items-center{align-items:center!important}.sm\:justify-end{justify-content:flex-end!important}.sm\:justify-items-start{justify-items:start!important}.sm\:gap-4{gap:1rem!important}.sm\:p-3{padding:.75rem!important}.sm\:px-12{padding-left:3rem!important;padding-right:3rem!important}.sm\:px-4{padding-left:1rem!important;padding-right:1rem!important}.sm\:px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.sm\:pt-6{padding-top:1.5rem!important}.sm\:text-left{text-align:left!important}.sm\:text-2xl{font-size:1.5rem!important;line-height:2rem!important}.sm\:text-4xl{font-size:2.25rem!important;line-height:2.5rem!important}.sm\:text-7xl{font-size:4.5rem!important;line-height:1!important}.sm\:text-base{font-size:1rem!important}.sm\:text-base,.sm\:text-sm{line-height:1.5rem!important}.sm\:text-sm{font-size:.875rem!important}}@media (min-width:768px){.md\:absolute{position:absolute!important}.md\:right-8{right:2rem!important}.md\:right-\[3\.75rem\]{right:3.75rem!important}.md\:top-\[40\%\]{top:40%!important}.md\:top-\[53\%\]{top:53%!important}.md\:col-span-4{grid-column:span 4/span 4!important}.md\:col-span-5{grid-column:span 5/span 5!important}.md\:col-span-6{grid-column:span 6/span 6!important}.md\:col-span-7{grid-column:span 7/span 7!important}.md\:col-span-8{grid-column:span 8/span 8!important}.md\:mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.md\:mx-4{margin-left:1rem!important;margin-right:1rem!important}.md\:my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.md\:mb-0{margin-bottom:0!important}.md\:mb-3{margin-bottom:.75rem!important}.md\:mr-3{margin-right:.75rem!important}.md\:mt-0{margin-top:0!important}.md\:mt-6{margin-top:1.5rem!important}.md\:hidden{display:none!important}.md\:h-16{height:4rem!important}.md\:max-h-\[90vh\]{max-height:90vh!important}.md\:min-h-50-screen{min-height:50vh!important}.md\:w-1\/2{width:50%!important}.md\:w-60{width:15rem!important}.md\:max-w-\[700px\]{max-width:700px!important}.md\:-translate-y-20{--tw-translate-y:-5rem!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.md\:flex-row{flex-direction:row!important}.md\:items-end{align-items:flex-end!important}.md\:gap-x-4{-moz-column-gap:1rem!important;column-gap:1rem!important}.md\:gap-x-6{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.md\:px-1{padding-left:.25rem!important;padding-right:.25rem!important}.md\:px-3{padding-left:.75rem!important;padding-right:.75rem!important}.md\:px-4{padding-left:1rem!important;padding-right:1rem!important}.md\:px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.md\:py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.md\:text-base{font-size:1rem!important;line-height:1.5rem!important}}@media (min-width:992px){.lg\:relative{position:relative!important}.lg\:bottom-2{bottom:.5rem!important}.lg\:left-48{left:12rem!important}.lg\:top-24{top:6rem!important}.lg\:order-1{order:1!important}.lg\:order-2{order:2!important}.lg\:col-span-1{grid-column:span 1/span 1!important}.lg\:col-span-4{grid-column:span 4/span 4!important}.lg\:col-span-5{grid-column:span 5/span 5!important}.lg\:col-span-6{grid-column:span 6/span 6!important}.lg\:col-span-8{grid-column:span 8/span 8!important}.lg\:mx-0{margin-left:0!important;margin-right:0!important}.lg\:mx-4{margin-left:1rem!important;margin-right:1rem!important}.lg\:mx-8{margin-left:2rem!important;margin-right:2rem!important}.lg\:my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.lg\:mt-0{margin-top:0!important}.lg\:mt-4{margin-top:1rem!important}.lg\:mt-8{margin-top:2rem!important}.lg\:block{display:block!important}.lg\:inline{display:inline!important}.lg\:flex{display:flex!important}.lg\:hidden{display:none!important}.lg\:h-24{height:6rem!important}.lg\:h-36{height:9rem!important}.lg\:h-9{height:2.25rem!important}.lg\:max-h-\[550px\]{max-height:550px!important}.lg\:w-36{width:9rem!important}.lg\:w-80{width:20rem!important}.lg\:w-9{width:2.25rem!important}.lg\:w-\[400px\]{width:400px!important}.lg\:max-w-\[700px\]{max-width:700px!important}.lg\:translate-x-0{--tw-translate-x:0px!important}.lg\:translate-x-0,.lg\:translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.lg\:translate-y-0{--tw-translate-y:0px!important}.lg\:flex-row{flex-direction:row!important}.lg\:flex-nowrap{flex-wrap:nowrap!important}.lg\:justify-start{justify-content:flex-start!important}.lg\:justify-end{justify-content:flex-end!important}.lg\:justify-between{justify-content:space-between!important}.lg\:gap-6{gap:1.5rem!important}.lg\:bg-gray-50{--tw-bg-opacity:1!important;background-color:rgb(248 249 250/var(--tw-bg-opacity))!important}.lg\:px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.lg\:pb-1{padding-bottom:.25rem!important}.lg\:pb-28{padding-bottom:7rem!important}.lg\:pt-6{padding-top:1.5rem!important}.lg\:text-left{text-align:left!important}.lg\:text-base{font-size:1rem!important}.lg\:text-base,.lg\:text-sm{line-height:1.5rem!important}.lg\:text-sm{font-size:.875rem!important}}@media (min-width:1200px){.xl\:left-0{left:0!important}.xl\:right-24{right:6rem!important}.xl\:right-6{right:1.5rem!important}.xl\:ml-6{margin-left:1.5rem!important}.xl\:ml-68{margin-left:17rem!important}.xl\:hidden{display:none!important}.xl\:h-44{height:11rem!important}.xl\:max-h-\[550px\]{max-height:550px!important}.xl\:w-1\/3{width:33.333333%!important}.xl\:w-44{width:11rem!important}.xl\:w-\[500px\]{width:500px!important}.xl\:max-w-\[1200px\]{max-width:1200px!important}.xl\:translate-x-0{--tw-translate-x:0px!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.xl\:p-1{padding:.25rem!important}.xl\:p-1\.5{padding:.375rem!important}.xl\:pl-75{padding-left:18.75rem!important}.xl\:text-base{font-size:1rem!important;line-height:1.5rem!important}}@media (min-width:1320px){.\32xl\:col-span-4{grid-column:span 4/span 4!important}.\32xl\:col-span-6{grid-column:span 6/span 6!important}.\32xl\:my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.\32xl\:max-w-\[1500px\]{max-width:1500px!important}.\32xl\:text-3xl{font-size:1.875rem!important;line-height:2.25rem!important}.\32xl\:text-5xl{font-size:3rem!important;line-height:1!important}.\32xl\:text-8xl{font-size:5rem!important;line-height:1!important}.\32xl\:text-lg{font-size:1.125rem!important;line-height:1.75rem!important}}@media (min-width:1920px){.\33xl\:col-span-3{grid-column:span 3/span 3!important}.\33xl\:col-span-4{grid-column:span 4/span 4!important}.\33xl\:col-span-5{grid-column:span 5/span 5!important}.\33xl\:inline{display:inline!important}.\33xl\:max-w-none{max-width:none!important}.\33xl\:translate-x-60{--tw-translate-x:15rem!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.\33xl\:text-6xl{font-size:3.75rem!important;line-height:1!important}.\33xl\:text-9xl{font-size:6rem!important;line-height:1!important}.\33xl\:text-xl{font-size:1.25rem!important;line-height:1.75rem!important}}@media (min-width:340px){.xs\:flex-row{flex-direction:row!important}.xs\:items-center{align-items:center!important}.xs\:justify-start{justify-content:flex-start!important}.xs\:pl-2{padding-left:.5rem!important}.xs\:text-base{font-size:1rem!important}.xs\:text-base,.xs\:text-sm{line-height:1.5rem!important}.xs\:text-sm{font-size:.875rem!important}}.\[\&\>\*\]\:bg-primary>*{--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important} \ No newline at end of file +/*! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e9ecef}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Open Sans;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#ced4da}input::placeholder,textarea::placeholder{opacity:1;color:#ced4da}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#5e72e480;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.\!container{width:100%!important;margin-right:auto!important;margin-left:auto!important;padding-right:1.5rem!important;padding-left:1.5rem!important}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:1.5rem;padding-left:1.5rem}@media (min-width:340px){.\!container{max-width:340px!important}.container{max-width:340px}}@media (min-width:576px){.\!container{max-width:576px!important}.container{max-width:576px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:992px){.\!container{max-width:992px!important}.container{max-width:992px}}@media (min-width:1200px){.\!container{max-width:1200px!important}.container{max-width:1200px}}@media (min-width:1320px){.\!container{max-width:1320px!important}.container{max-width:1320px}}@media (min-width:1920px){.\!container{max-width:1920px!important}.container{max-width:1920px}}a{letter-spacing:-.025rem}hr{margin:1rem 0;border:0;opacity:.25}img{max-width:none}label{display:inline-block}p{line-height:1.625;font-weight:400;margin-bottom:1rem}small{font-size:.875em}svg{display:inline}table{border-collapse:inherit}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;color:#344767}h1,h2,h3,h4{letter-spacing:-.05rem}h1,h2,h3{font-weight:700}h4,h5,h6{font-weight:600}h1{font-size:3rem;line-height:1.25}h2{font-size:2.25rem;line-height:1.3}h3{font-size:1.875rem}h3,h4{line-height:1.375}h4{font-size:1.5rem}h5{font-size:1.25rem;line-height:1.375}h6{font-size:1rem;line-height:1.625}.sr-only{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-width:0!important}.pointer-events-none{pointer-events:none!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.collapse{visibility:collapse!important}.static{position:static!important}.fixed{position:fixed!important}.absolute{position:absolute!important}.relative{position:relative!important}.inset-y-0{top:0!important;bottom:0!important}.-left-full{left:-100%!important}.-right-0{right:0!important}.-right-1{right:-.25rem!important}.bottom-0{bottom:0!important}.bottom-1{bottom:.25rem!important}.bottom-1\.5{bottom:.375rem!important}.bottom-2{bottom:.5rem!important}.bottom-24{bottom:6rem!important}.bottom-3{bottom:.75rem!important}.bottom-4{bottom:1rem!important}.bottom-6{bottom:1.5rem!important}.bottom-7{bottom:1.75rem!important}.bottom-8{bottom:2rem!important}.left-0{left:0!important}.left-1{left:.25rem!important}.left-16{left:4rem!important}.left-20{left:5rem!important}.left-24{left:6rem!important}.left-32{left:8rem!important}.left-4{left:1rem!important}.left-40{left:10rem!important}.left-48{left:12rem!important}.left-8{left:2rem!important}.left-auto{left:auto!important}.left-full{left:100%!important}.right-0{right:0!important}.right-12{right:3rem!important}.right-2{right:.5rem!important}.right-20{right:5rem!important}.right-4{right:1rem!important}.right-5{right:1.25rem!important}.right-6{right:1.5rem!important}.right-7{right:1.75rem!important}.right-8{right:2rem!important}.right-\[3\.25rem\]{right:3.25rem!important}.top-0{top:0!important}.top-1{top:.25rem!important}.top-1\.5{top:.375rem!important}.top-1\/2{top:50%!important}.top-10{top:2.5rem!important}.top-12{top:3rem!important}.top-14{top:3.5rem!important}.top-16{top:4rem!important}.top-2{top:.5rem!important}.top-24{top:6rem!important}.top-3{top:.75rem!important}.top-36{top:9rem!important}.top-4{top:1rem!important}.top-6{top:1.5rem!important}.top-7{top:1.75rem!important}.top-8{top:2rem!important}.top-\[38\%\]{top:38%!important}.top-\[4\.5rem\]{top:4.5rem!important}.top-\[52\%\]{top:52%!important}.top-\[55\%\]{top:55%!important}.top-\[8\.2rem\]{top:8.2rem!important}.-z-10{z-index:-10!important}.z-0{z-index:0!important}.z-10{z-index:10!important}.z-100{z-index:100!important}.z-110{z-index:110!important}.z-20{z-index:20!important}.z-990{z-index:990!important}.z-\[10000\]{z-index:10000!important}.z-\[1000\]{z-index:1000!important}.z-\[1001\]{z-index:1001!important}.z-\[20\]{z-index:20!important}.z-sticky{z-index:1020!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.col-span-1{grid-column:span 1/span 1!important}.col-span-10{grid-column:span 10/span 10!important}.col-span-11{grid-column:span 11/span 11!important}.col-span-12{grid-column:span 12/span 12!important}.col-span-2{grid-column:span 2/span 2!important}.col-span-3{grid-column:span 3/span 3!important}.col-span-4{grid-column:span 4/span 4!important}.col-span-5{grid-column:span 5/span 5!important}.col-span-6{grid-column:span 6/span 6!important}.col-span-9{grid-column:span 9/span 9!important}.float-right{float:right!important}.float-left{float:left!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-1\.5{margin-left:.375rem!important;margin-right:.375rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-2\.5{margin-left:.625rem!important;margin-right:.625rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.mx-auto{margin-left:auto!important;margin-right: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:.75rem!important;margin-bottom:.75rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.mb-0{margin-bottom:0!important}.mb-0\.5{margin-bottom:.125rem!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-2\.5{margin-bottom:.625rem!important}.mb-3{margin-bottom:.75rem!important}.mb-4{margin-bottom:1rem!important}.mb-6{margin-bottom:1.5rem!important}.mb-7{margin-bottom:1.75rem!important}.mb-8{margin-bottom:2rem!important}.ml-0{margin-left:0!important}.ml-1{margin-left:.25rem!important}.ml-12{margin-left:3rem!important}.ml-2{margin-left:.5rem!important}.ml-3{margin-left:.75rem!important}.ml-4{margin-left:1rem!important}.mr-1{margin-right:.25rem!important}.mr-12{margin-right:3rem!important}.mr-2{margin-right:.5rem!important}.mr-3{margin-right:.75rem!important}.mr-4{margin-right:1rem!important}.mt-0{margin-top:0!important}.mt-0\.5{margin-top:.125rem!important}.mt-1{margin-top:.25rem!important}.mt-10{margin-top:2.5rem!important}.mt-12{margin-top:3rem!important}.mt-16{margin-top:4rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:.75rem!important}.mt-4{margin-top:1rem!important}.mt-5{margin-top:1.25rem!important}.mt-6{margin-top:1.5rem!important}.mt-8{margin-top:2rem!important}.mt-\[15vh\]{margin-top:15vh!important}.mt-\[4\.5rem\]{margin-top:4.5rem!important}.block{display:block!important}.inline-block{display:inline-block!important}.inline{display:inline!important}.flex{display:flex!important}.table{display:table!important}.grid{display:grid!important}.list-item{display:list-item!important}.\!hidden,.hidden{display:none!important}.h-1{height:.25rem!important}.h-1\/3{height:33.333333%!important}.h-12{height:3rem!important}.h-14{height:3.5rem!important}.h-3{height:.75rem!important}.h-32{height:8rem!important}.h-4{height:1rem!important}.h-4\.5{height:1.125rem!important}.h-40{height:10rem!important}.h-5{height:1.25rem!important}.h-5\.5{height:1.375rem!important}.h-6{height:1.5rem!important}.h-7{height:1.75rem!important}.h-8{height:2rem!important}.h-96{height:24rem!important}.h-\[2\.5rem\]{height:2.5rem!important}.h-\[250px\]{height:250px!important}.h-\[3\.5rem\]{height:3.5rem!important}.h-\[4rem\]{height:4rem!important}.h-\[50vh\]{height:50vh!important}.h-\[80vh\]{height:80vh!important}.h-\[90vh\]{height:90vh!important}.h-fit{height:-moz-fit-content!important;height:fit-content!important}.h-full{height:100%!important}.h-px{height:1px!important}.h-screen{height:100vh!important}.h-\[85vh\]{height:85vh!important}.h-\[70vh\]{height:70vh!important}.max-h-100{max-height:25rem!important}.max-h-30{max-height:7.5rem!important}.max-h-80{max-height:20rem!important}.max-h-\[200px\]{max-height:200px!important}.max-h-\[250px\]{max-height:250px!important}.max-h-\[350px\]{max-height:350px!important}.max-h-\[400px\]{max-height:400px!important}.max-h-\[70vh\]{max-height:70vh!important}.max-h-\[90vh\]{max-height:90vh!important}.max-h-\[95vh\]{max-height:95vh!important}.max-h-screen{max-height:100vh!important}.min-h-12{min-height:3rem!important}.min-h-20{min-height:5rem!important}.min-h-52{min-height:13rem!important}.min-h-6{min-height:1.5rem!important}.min-h-\[100px\]{min-height:100px!important}.min-h-\[200px\]{min-height:200px!important}.min-h-\[350px\]{min-height:350px!important}.min-h-\[400px\]{min-height:400px!important}.min-h-\[55vh\]{min-height:55vh!important}.min-h-\[75px\]{min-height:75px!important}.min-h-\[85vh\]{min-height:85vh!important}.min-h-screen{min-height:100vh!important}.w-1{width:.25rem!important}.w-10{width:2.5rem!important}.w-11\/12{width:91.666667%!important}.w-28{width:7rem!important}.w-3{width:.75rem!important}.w-32{width:8rem!important}.w-4{width:1rem!important}.w-4\.5{width:1.125rem!important}.w-40{width:10rem!important}.w-48{width:12rem!important}.w-5{width:1.25rem!important}.w-5\.5{width:1.375rem!important}.w-50{width:12.5rem!important}.w-6{width:1.5rem!important}.w-7{width:1.75rem!important}.w-8{width:2rem!important}.w-80{width:20rem!important}.w-90{width:22.5rem!important}.w-\[2\.5rem\]{width:2.5rem!important}.w-\[50vw\]{width:50vw!important}.w-auto{width:auto!important}.w-fit{width:-moz-fit-content!important;width:fit-content!important}.w-full{width:100%!important}.w-screen{width:100vw!important}.min-w-0{min-width:0!important}.min-w-\[1150px\]{min-width:1150px!important}.min-w-\[1300px\]{min-width:1300px!important}.min-w-\[200px\]{min-width:200px!important}.min-w-\[300px\]{min-width:300px!important}.min-w-\[600px\]{min-width:600px!important}.min-w-\[800px\]{min-width:800px!important}.min-w-\[900px\]{min-width:900px!important}.max-w-40{max-width:10rem!important}.max-w-60{max-width:15rem!important}.max-w-64{max-width:16rem!important}.max-w-\[1000px\]{max-width:1000px!important}.max-w-\[150px\]{max-width:150px!important}.max-w-\[1920px\]{max-width:1920px!important}.max-w-\[300px\]{max-width:300px!important}.max-w-\[400px\]{max-width:400px!important}.max-w-\[450px\]{max-width:450px!important}.max-w-\[550px\]{max-width:550px!important}.max-w-\[650px\]{max-width:650px!important}.max-w-\[700px\]{max-width:700px!important}.max-w-full{max-width:100%!important}.max-w-none{max-width:none!important}.max-w-screen-lg{max-width:992px!important}.flex-auto{flex:1 1 auto!important}.grow{flex-grow:1!important}.basis-full{flex-basis:100%!important}.border-collapse{border-collapse:collapse!important}.-translate-x-1{--tw-translate-x:-0.25rem!important}.-translate-x-1,.-translate-x-1\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-1\.5{--tw-translate-x:-0.375rem!important}.-translate-x-36{--tw-translate-x:-9rem!important}.-translate-x-36,.-translate-x-40{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-40{--tw-translate-x:-10rem!important}.-translate-x-48{--tw-translate-x:-12rem!important}.-translate-x-48,.-translate-x-52{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-52{--tw-translate-x:-13rem!important}.-translate-x-56{--tw-translate-x:-14rem!important}.-translate-x-56,.-translate-x-60{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-60{--tw-translate-x:-15rem!important}.-translate-x-64{--tw-translate-x:-16rem!important}.-translate-x-64,.-translate-x-72{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-x-72{--tw-translate-x:-18rem!important}.-translate-x-full{--tw-translate-x:-100%!important}.-translate-x-full,.-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-0{--tw-translate-y:-0px!important}.-translate-y-0\.4{--tw-translate-y:-0.1rem!important}.-translate-y-0\.4,.-translate-y-0\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-0\.5{--tw-translate-y:-0.125rem!important}.-translate-y-1{--tw-translate-y:-0.25rem!important}.-translate-y-1,.-translate-y-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-12{--tw-translate-y:-3rem!important}.-translate-y-16{--tw-translate-y:-4rem!important}.-translate-y-16,.-translate-y-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-2{--tw-translate-y:-0.5rem!important}.-translate-y-20{--tw-translate-y:-5rem!important}.-translate-y-20,.-translate-y-24{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-24{--tw-translate-y:-6rem!important}.-translate-y-28{--tw-translate-y:-7rem!important}.-translate-y-28,.-translate-y-36{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-36{--tw-translate-y:-9rem!important}.-translate-y-4{--tw-translate-y:-1rem!important}.-translate-y-4,.-translate-y-6{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-6{--tw-translate-y:-1.5rem!important}.-translate-y-8{--tw-translate-y:-2rem!important}.-translate-y-8,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-0{--tw-translate-x:0px!important}.translate-x-0\.5{--tw-translate-x:0.125rem!important}.translate-x-0\.5,.translate-x-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-1{--tw-translate-x:0.25rem!important}.translate-x-16{--tw-translate-x:4rem!important}.translate-x-16,.translate-x-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-2{--tw-translate-x:0.5rem!important}.translate-x-24{--tw-translate-x:6rem!important}.translate-x-24,.translate-x-3{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-3{--tw-translate-x:0.75rem!important}.translate-x-32{--tw-translate-x:8rem!important}.translate-x-32,.translate-x-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-4{--tw-translate-x:1rem!important}.translate-x-40{--tw-translate-x:10rem!important}.translate-x-40,.translate-x-48{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-48{--tw-translate-x:12rem!important}.translate-x-52{--tw-translate-x:13rem!important}.translate-x-52,.translate-x-56{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-56{--tw-translate-x:14rem!important}.translate-x-60{--tw-translate-x:15rem!important}.translate-x-60,.translate-x-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-90{--tw-translate-x:22.5rem!important}.translate-x-\[3rem\]{--tw-translate-x:3rem!important}.translate-x-\[3rem\],.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-y-0{--tw-translate-y:0px!important}.translate-y-0\.5{--tw-translate-y:0.125rem!important}.translate-y-0\.5,.translate-y-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-y-1{--tw-translate-y:0.25rem!important}.translate-y-16{--tw-translate-y:4rem!important}.translate-y-16,.translate-y-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-y-2{--tw-translate-y:0.5rem!important}.-rotate-12{--tw-rotate:-12deg!important}.-rotate-12,.rotate-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.rotate-12{--tw-rotate:12deg!important}.rotate-180{--tw-rotate:180deg!important}.rotate-180,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.rotate-90{--tw-rotate:90deg!important}.scale-105{--tw-scale-x:1.05!important;--tw-scale-y:1.05!important}.scale-105,.scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.scale-110{--tw-scale-x:1.1!important;--tw-scale-y:1.1!important}.scale-50{--tw-scale-x:.5!important;--tw-scale-y:.5!important}.scale-50,.scale-75{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.scale-75{--tw-scale-x:.75!important;--tw-scale-y:.75!important}.scale-90{--tw-scale-x:.9!important;--tw-scale-y:.9!important}.scale-90,.scale-\[0\.6\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.scale-\[0\.6\]{--tw-scale-x:0.6!important;--tw-scale-y:0.6!important}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-pointer{cursor:pointer!important}.cursor-text{cursor:text!important}.select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.resize{resize:both!important}.list-none{list-style-type:none!important}.appearance-none{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))!important}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.flex-row{flex-direction:row!important}.flex-col{flex-direction:column!important}.flex-wrap{flex-wrap:wrap!important}.items-start{align-items:flex-start!important}.items-end{align-items:flex-end!important}.items-center{align-items:center!important}.justify-start{justify-content:flex-start!important}.justify-end{justify-content:flex-end!important}.justify-center{justify-content:center!important}.justify-between{justify-content:space-between!important}.justify-items-center{justify-items:center!important}.gap-2{gap:.5rem!important}.gap-3{gap:.75rem!important}.gap-4{gap:1rem!important}.gap-8{gap:2rem!important}.gap-x-4{-moz-column-gap:1rem!important;column-gap:1rem!important}.gap-y-2{row-gap:.5rem!important}.gap-y-3{row-gap:.75rem!important}.gap-y-4{row-gap:1rem!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.whitespace-normal{white-space:normal!important}.whitespace-nowrap{white-space:nowrap!important}.break-words{overflow-wrap:break-word!important}.rounded,.rounded-1{border-radius:.25rem!important}.rounded-1\.4{border-radius:.35rem!important}.rounded-10{border-radius:2.5rem!important}.rounded-2xl{border-radius:1rem!important}.rounded-circle{border-radius:50%!important}.rounded-full{border-radius:9999px!important}.rounded-lg{border-radius:.5rem!important}.rounded-none{border-radius:0!important}.rounded-xl{border-radius:.75rem!important}.rounded-b{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-b-lg{border-bottom-left-radius:.5rem!important}.rounded-b-lg,.rounded-r-lg{border-bottom-right-radius:.5rem!important}.rounded-r-lg{border-top-right-radius:.5rem!important}.rounded-t{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-t-2xl{border-top-left-radius:1rem!important;border-top-right-radius:1rem!important}.rounded-t-lg{border-top-left-radius:.5rem!important;border-top-right-radius:.5rem!important}.border{border-width:1px!important}.border-0{border-width:0!important}.border-2{border-width:2px!important}.border-b{border-bottom-width:1px!important}.border-b-0{border-bottom-width:0!important}.border-l{border-left-width:1px!important}.border-r{border-right-width:1px!important}.border-t{border-top-width:1px!important}.border-solid{border-style:solid!important}.border-dashed{border-style:dashed!important}.border-gray-100{--tw-border-opacity:1!important;border-color:rgb(235 239 244/var(--tw-border-opacity))!important}.border-gray-100\/50{border-color:#ebeff480!important}.border-gray-200{--tw-border-opacity:1!important;border-color:rgb(233 236 239/var(--tw-border-opacity))!important}.border-gray-300{--tw-border-opacity:1!important;border-color:rgb(210 214 218/var(--tw-border-opacity))!important}.border-gray-400{--tw-border-opacity:1!important;border-color:rgb(206 212 218/var(--tw-border-opacity))!important}.border-gray-700{--tw-border-opacity:1!important;border-color:rgb(73 80 87/var(--tw-border-opacity))!important}.border-primary{--tw-border-opacity:1!important;border-color:rgb(11 85 119/var(--tw-border-opacity))!important}.bg-blue-500{--tw-bg-opacity:1!important;background-color:rgb(94 114 228/var(--tw-bg-opacity))!important}.bg-emerald-500{--tw-bg-opacity:1!important;background-color:rgb(45 206 137/var(--tw-bg-opacity))!important}.bg-emerald-500\/80{background-color:#2dce89cc!important}.bg-gray-100{background-color:rgb(235 239 244/var(--tw-bg-opacity))!important}.bg-gray-100,.bg-gray-200{--tw-bg-opacity:1!important}.bg-gray-200{background-color:rgb(233 236 239/var(--tw-bg-opacity))!important}.bg-gray-300{background-color:rgb(210 214 218/var(--tw-bg-opacity))!important}.bg-gray-300,.bg-gray-50{--tw-bg-opacity:1!important}.bg-gray-50{background-color:rgb(248 249 250/var(--tw-bg-opacity))!important}.bg-gray-500{--tw-bg-opacity:1!important;background-color:rgb(173 181 189/var(--tw-bg-opacity))!important}.bg-gray-500\/80{background-color:#adb5bdcc!important}.bg-gray-600{--tw-bg-opacity:1!important;background-color:rgb(108 117 125/var(--tw-bg-opacity))!important}.bg-gray-600\/50{background-color:#6c757d80!important}.bg-gray-600\/80{background-color:#6c757dcc!important}.bg-green-500{--tw-bg-opacity:1!important;background-color:rgb(34 197 94/var(--tw-bg-opacity))!important}.bg-green-500\/80{background-color:#22c55ecc!important}.bg-orange-500{--tw-bg-opacity:1!important;background-color:rgb(251 99 64/var(--tw-bg-opacity))!important}.bg-orange-500\/80{background-color:#fb6340cc!important}.bg-primary{--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important}.bg-primary\/10{background-color:#0b55771a!important}.bg-red-500{--tw-bg-opacity:1!important;background-color:rgb(245 57 57/var(--tw-bg-opacity))!important}.bg-red-500\/80{background-color:#f53939cc!important}.bg-secondary{background-color:rgb(46 172 104/var(--tw-bg-opacity))!important}.bg-secondary,.bg-sky-500{--tw-bg-opacity:1!important}.bg-sky-500{background-color:rgb(14 165 233/var(--tw-bg-opacity))!important}.bg-sky-500\/80{background-color:#0ea5e9cc!important}.bg-slate-800\/10{background-color:#3a416f1a!important}.bg-transparent{background-color:initial!important}.bg-white{background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.bg-white,.bg-yellow-400{--tw-bg-opacity:1!important}.bg-yellow-400{background-color:rgb(251 207 51/var(--tw-bg-opacity))!important}.bg-yellow-400\/80{background-color:#fbcf33cc!important}.bg-yellow-500{--tw-bg-opacity:1!important;background-color:rgb(251 177 64/var(--tw-bg-opacity))!important}.bg-yellow-500\/80{background-color:#fbb140cc!important}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))!important}.bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))!important}.bg-none{background-image:none!important}.from-\[\#075577\]{--tw-gradient-from:#075577 var(--tw-gradient-from-position)!important;--tw-gradient-to:#07557700 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.from-\[\#0b5577\]{--tw-gradient-from:#0b5577 var(--tw-gradient-from-position)!important;--tw-gradient-to:#0b557700 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.from-transparent{--tw-gradient-from:#0000 var(--tw-gradient-from-position)!important;--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}.via-black\/40{--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),#0006 var(--tw-gradient-via-position),var(--tw-gradient-to)!important}.to-\[\#116D70\]{--tw-gradient-to:#116d70 var(--tw-gradient-to-position)!important}.to-transparent{--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important}.bg-150{background-size:150%!important}.bg-contain{background-size:contain!important}.bg-clip-border{background-clip:initial!important}.bg-clip-padding{background-clip:padding-box!important}.bg-center{background-position:50%!important}.bg-left{background-position:0!important}.bg-x-25{background-position:25% 0!important}.bg-no-repeat{background-repeat:no-repeat!important}.fill-blue-500{fill:#5e72e4!important}.fill-gray-500{fill:#adb5bd!important}.fill-gray-600{fill:#6c757d!important}.fill-gray-700{fill:#495057!important}.fill-green-500{fill:#22c55e!important}.fill-primary{fill:#0b5577!important}.fill-red-500{fill:#f53939!important}.fill-sky-500{fill:#0ea5e9!important}.fill-slate-800{fill:#3a416f!important}.fill-white{fill:#fff!important}.fill-yellow-500{fill:#fbb140!important}.stroke-amber-500{stroke:#f59e0b!important}.stroke-blue-400{stroke:#60a5fa!important}.stroke-blue-500{stroke:#5e72e4!important}.stroke-emerald-600{stroke:#059669!important}.stroke-gray-100{stroke:#ebeff4!important}.stroke-gray-100\/50{stroke:#ebeff480!important}.stroke-gray-600{stroke:#6c757d!important}.stroke-gray-700{stroke:#495057!important}.stroke-gray-800{stroke:#252f40!important}.stroke-green-700{stroke:#15803d!important}.stroke-orange-500{stroke:#fb6340!important}.stroke-pink-600{stroke:#db2777!important}.stroke-red-500{stroke:#f53939!important}.stroke-sky-500{stroke:#0ea5e9!important}.stroke-stone-500{stroke:#78716c!important}.stroke-white{stroke:#fff!important}.stroke-yellow-400{stroke:#fbcf33!important}.stroke-yellow-500{stroke:#fbb140!important}.stroke-0{stroke-width:0!important}.object-cover{-o-object-fit:cover!important;object-fit:cover!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:.75rem!important}.p-4{padding:1rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-0\.5{padding-left:.125rem!important;padding-right:.125rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-1\.5{padding-left:.375rem!important;padding-right:.375rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-28{padding-left:7rem!important;padding-right:7rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-8{padding-left:2rem!important;padding-right:2rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-0\.5{padding-top:.125rem!important;padding-bottom:.125rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-1\.5{padding-top:.375rem!important;padding-bottom:.375rem!important}.py-10{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-12{padding-top:3rem!important;padding-bottom:3rem!important}.py-16{padding-top:4rem!important;padding-bottom:4rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-2\.5{padding-top:.625rem!important;padding-bottom:.625rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.py-8{padding-top:2rem!important;padding-bottom:2rem!important}.pb-0{padding-bottom:0!important}.pb-10{padding-bottom:2.5rem!important}.pb-16{padding-bottom:4rem!important}.pb-2{padding-bottom:.5rem!important}.pb-24{padding-bottom:6rem!important}.pb-28{padding-bottom:7rem!important}.pb-4{padding-bottom:1rem!important}.pb-6{padding-bottom:1.5rem!important}.pb-8{padding-bottom:2rem!important}.pl-0{padding-left:0!important}.pl-2{padding-left:.5rem!important}.pl-3{padding-left:.75rem!important}.pl-6{padding-left:1.5rem!important}.pt-1{padding-top:.25rem!important}.pt-10{padding-top:2.5rem!important}.pt-2{padding-top:.5rem!important}.pt-20{padding-top:5rem!important}.pt-3{padding-top:.75rem!important}.pt-4{padding-top:1rem!important}.pt-6{padding-top:1.5rem!important}.pt-8{padding-top:2rem!important}.pt-9{padding-top:2.25rem!important}.text-left{text-align:left!important}.text-center{text-align:center!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.font-sans{font-family:Open Sans!important}.text-2xl{font-size:1.5rem!important;line-height:2rem!important}.text-3xl{font-size:1.875rem!important;line-height:2.25rem!important}.text-4xl{font-size:2.25rem!important;line-height:2.5rem!important}.text-5xl{font-size:3rem!important}.text-5xl,.text-6xl{line-height:1!important}.text-6xl{font-size:3.75rem!important}.text-7xl{font-size:4.5rem!important}.text-7xl,.text-9xl{line-height:1!important}.text-9xl{font-size:6rem!important}.text-\[0\.7rem\]{font-size:.7rem!important}.text-\[1\.1rem\]{font-size:1.1rem!important}.text-base{font-size:1rem!important;line-height:1.5rem!important}.text-lg{font-size:1.125rem!important;line-height:1.75rem!important}.text-sm{font-size:.875rem!important;line-height:1.5rem!important}.text-xl{font-size:1.25rem!important;line-height:1.75rem!important}.text-xs{font-size:.75rem!important;line-height:1rem!important}.font-bold{font-weight:700!important}.font-medium{font-weight:500!important}.font-normal{font-weight:400!important}.font-semibold{font-weight:600!important}.uppercase{text-transform:uppercase!important}.capitalize{text-transform:capitalize!important}.italic{font-style:italic!important}.ordinal{--tw-ordinal:ordinal!important;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)!important}.leading-5{line-height:1.25rem!important}.leading-5\.6{line-height:1.4rem!important}.leading-6{line-height:1.5rem!important}.leading-default{line-height:1.6!important}.leading-none{line-height:1!important}.leading-normal{line-height:1.5!important}.leading-tight{line-height:1.25!important}.tracking-\[0\.20rem\]{letter-spacing:.2rem!important}.tracking-normal{letter-spacing:0!important}.tracking-tight-rem{letter-spacing:-.025rem!important}.tracking-wide{letter-spacing:.025em!important}.tracking-wider{letter-spacing:.05em!important}.tracking-widest{letter-spacing:.1em!important}.text-blue-500{--tw-text-opacity:1!important;color:rgb(94 114 228/var(--tw-text-opacity))!important}.text-gray-100{--tw-text-opacity:1!important;color:rgb(235 239 244/var(--tw-text-opacity))!important}.text-gray-100\/50{color:#ebeff480!important}.text-gray-300{--tw-text-opacity:1!important;color:rgb(210 214 218/var(--tw-text-opacity))!important}.text-gray-50{--tw-text-opacity:1!important;color:rgb(248 249 250/var(--tw-text-opacity))!important}.text-gray-500{--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}.text-gray-600{--tw-text-opacity:1!important;color:rgb(108 117 125/var(--tw-text-opacity))!important}.text-gray-700{--tw-text-opacity:1!important;color:rgb(73 80 87/var(--tw-text-opacity))!important}.text-gray-700\/80{color:#495057cc!important}.text-gray-800{--tw-text-opacity:1!important;color:rgb(37 47 64/var(--tw-text-opacity))!important}.text-green-500{--tw-text-opacity:1!important;color:rgb(34 197 94/var(--tw-text-opacity))!important}.text-primary{color:rgb(11 85 119/var(--tw-text-opacity))!important}.text-primary,.text-red-500{--tw-text-opacity:1!important}.text-red-500{color:rgb(245 57 57/var(--tw-text-opacity))!important}.text-secondary{--tw-text-opacity:1!important;color:rgb(46 172 104/var(--tw-text-opacity))!important}.text-sky-500{--tw-text-opacity:1!important;color:rgb(14 165 233/var(--tw-text-opacity))!important}.text-slate-500{--tw-text-opacity:1!important;color:rgb(103 116 142/var(--tw-text-opacity))!important}.text-slate-700{color:rgb(52 71 103/var(--tw-text-opacity))!important}.text-slate-700,.text-white{--tw-text-opacity:1!important}.text-white{color:rgb(255 255 255/var(--tw-text-opacity))!important}.text-yellow-400{--tw-text-opacity:1!important;color:rgb(251 207 51/var(--tw-text-opacity))!important}.text-yellow-500{--tw-text-opacity:1!important;color:rgb(251 177 64/var(--tw-text-opacity))!important}.underline{text-decoration-line:underline!important}.antialiased{-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.opacity-0{opacity:0!important}.opacity-100{opacity:1!important}.opacity-50{opacity:.5!important}.opacity-60{opacity:.6!important}.opacity-80{opacity:.8!important}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.shadow,.shadow-3xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-3xl{--tw-shadow:0 8px 26px -4px #14141426,0 8px 9px -5px #1414140f!important;--tw-shadow-colored:0 8px 26px -4px var(--tw-shadow-color),0 8px 9px -5px var(--tw-shadow-color)!important}.shadow-\[8px_8px_12px_rgb\(0\2c 0\2c 0\2c 0\.2\)\]{--tw-shadow:8px 8px 12px #0003!important;--tw-shadow-colored:8px 8px 12px var(--tw-shadow-color)!important}.shadow-\[8px_8px_12px_rgb\(0\2c 0\2c 0\2c 0\.2\)\],.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-md{--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014!important;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)!important}.shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.shadow-none,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-sm{--tw-shadow:0 .25rem .375rem -.0625rem #1414141f,0 .125rem .25rem -.0625rem #14141412!important;--tw-shadow-colored:0 .25rem .375rem -.0625rem var(--tw-shadow-color),0 .125rem .25rem -.0625rem var(--tw-shadow-color)!important}.shadow-xl{--tw-shadow:0 0 2rem 0 #8898aa26!important;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color)!important}.shadow-xl,.shadow-xs{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-xs{--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014!important;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color)!important}.outline-none{outline:2px solid #0000!important;outline-offset:2px!important}.outline{outline-style:solid!important}.outline-secondary{outline-color:#2eac68!important}.blur{--tw-blur:blur(8px)!important}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter!important;transition-timing-function:ease!important;transition-duration:.15s!important}.transition-all{transition-property:all!important;transition-timing-function:ease!important;transition-duration:.15s!important}.transition-transform{transition-property:transform!important;transition-timing-function:ease!important;transition-duration:.15s!important}.delay-200{transition-delay:.2s!important}.duration-200{transition-duration:.2s!important}.duration-250{transition-duration:.25s!important}.duration-300{transition-duration:.3s!important}.duration-700{transition-duration:.7s!important}.ease-in{transition-timing-function:ease-in!important}.ease-in-out{transition-timing-function:ease-in-out!important}.flex-wrap-inherit{flex-wrap:inherit!important}@font-face{font-family:Open Sans;src:url(../webfonts/OpenSans.ttf)}*{font-family:Open Sans,sans-serif}.ace_editor,.ace_editor *{font-family:Monaco,Menlo,Ubuntu Mono,Droid Sans Mono,Consolas,monospace!important;font-weight:400!important;letter-spacing:0!important}.sr-only{display:none}.separator{margin:.75rem 0 .5rem;height:1px;background-color:initial;--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to);--tw-gradient-stops:var(--tw-gradient-from),#0006 var(--tw-gradient-via-position),var(--tw-gradient-to);--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.separator,:is(.dark .separator){background-image:linear-gradient(to right,var(--tw-gradient-stops))}:is(.dark .separator){--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#fff var(--tw-gradient-via-position),var(--tw-gradient-to);--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.close-btn{display:inline-block;cursor:pointer;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(245 57 57/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(245 57 57/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.close-btn,.close-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.close-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.close-btn:focus,.close-btn:hover{background-color:#fffc}.close-btn:active{opacity:.85}.close-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.close-btn:disabled,.close-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.close-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .close-btn){--tw-bg-opacity:1;background-color:rgb(233 236 239/var(--tw-bg-opacity));--tw-brightness:brightness(.9)}:is(.dark .close-btn),:is(.dark .close-btn:hover){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .close-btn:hover){--tw-brightness:brightness(.75)}:is(.dark .close-btn:disabled){--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .close-btn:disabled),:is(.dark .close-btn:hover:disabled){border-color:#49505700;background-color:rgb(73 80 87/var(--tw-bg-opacity))}:is(.dark .close-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}@media (min-width:768px){.close-btn{padding:.625rem 1.25rem}}.valid-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.valid-btn,.valid-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.valid-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.valid-btn:focus,.valid-btn:hover{background-color:#22c55ecc}.valid-btn:active{opacity:.85}.valid-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.valid-btn:disabled,.valid-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.valid-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .valid-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .valid-btn:disabled){--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .valid-btn:disabled),:is(.dark .valid-btn:hover:disabled){border-color:#49505700;background-color:rgb(73 80 87/var(--tw-bg-opacity))}:is(.dark .valid-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}@media (min-width:768px){.valid-btn{padding:.625rem 1.25rem}}.delete-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(245 57 57/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.delete-btn,.delete-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.delete-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.delete-btn:focus,.delete-btn:hover{background-color:#f53939cc}.delete-btn:active{opacity:.85}.delete-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.delete-btn:disabled,.delete-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.delete-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .delete-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .delete-btn:disabled){border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .delete-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity))}@media (min-width:768px){.delete-btn{padding:.625rem 1.25rem}}.edit-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(251 177 64/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.edit-btn,.edit-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.edit-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.edit-btn:focus,.edit-btn:hover{background-color:#fbb140cc}.edit-btn:active{opacity:.85}.edit-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.edit-btn:disabled,.edit-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.edit-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .edit-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .edit-btn:disabled){--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .edit-btn:disabled),:is(.dark .edit-btn:hover:disabled){border-color:#49505700;background-color:rgb(73 80 87/var(--tw-bg-opacity))}:is(.dark .edit-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}@media (min-width:768px){.edit-btn{padding:.625rem 1.25rem}}.info-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.info-btn,.info-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.info-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.info-btn:focus,.info-btn:hover{background-color:#0ea5e9cc}.info-btn:active{opacity:.85}.info-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.info-btn:disabled,.info-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.info-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .info-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .info-btn:disabled){--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .info-btn:disabled),:is(.dark .info-btn:hover:disabled){border-color:#49505700;background-color:rgb(73 80 87/var(--tw-bg-opacity))}:is(.dark .info-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}@media (min-width:768px){.info-btn{padding:.625rem 1.25rem}}.checkbox{position:relative;z-index:10;float:left;margin-top:.25rem;height:1.25rem;width:1.25rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.35rem;border-width:1px;border-color:rgb(210 214 218/var(--tw-border-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));background-size:contain;background-position:50%;background-repeat:no-repeat;vertical-align:top;font-size:1rem;line-height:1.5rem;transition-property:all;transition-timing-function:ease;transition-duration:.25s}.checkbox,.checkbox:disabled{--tw-border-opacity:1;--tw-bg-opacity:1}.checkbox:disabled{cursor:default;border-color:rgb(206 212 218/var(--tw-border-opacity));background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.checkbox[data-checked=true]{z-index:0;--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity))}.checkbox:disabled[data-checked=true]{--tw-border-opacity:1;border-color:rgb(206 212 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}:is(.dark .checkbox){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity))}:is(.dark .checkbox:disabled){--tw-border-opacity:1;border-color:rgb(37 47 64/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 47 64/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .checkbox[data-checked=true]){--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity))}:is(.dark .checkbox:disabled[data-checked=true]){--tw-border-opacity:1;border-color:rgb(37 47 64/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 47 64/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}.custom-select-btn{display:flex;width:100%;align-items:center;justify-content:space-between;border-radius:.5rem;border-width:1px;border-style:solid;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:padding-box;padding:.25rem .375rem;text-align:left;vertical-align:middle;font-size:.875rem;font-weight:400;line-height:1.4rem;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}.custom-select-btn::-moz-placeholder{--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.custom-select-btn::placeholder{--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.custom-select-btn:focus{--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity))}.custom-select-btn:disabled{--tw-border-opacity:1;border-color:rgb(206 212 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));opacity:.75}:is(.dark .custom-select-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .custom-select-btn:disabled){--tw-border-opacity:1;border-color:rgb(37 47 64/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 47 64/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}@media (min-width:768px){.custom-select-btn{padding:.5rem .75rem}}.custom-dropdown-btn{position:relative;margin-top:0;margin-bottom:0;min-height:38px;cursor:pointer;border-radius:0;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.5rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.custom-dropdown-btn:hover{--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .custom-dropdown-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}.active.custom-dropdown-btn{position:relative;margin-top:0;margin-bottom:0;min-height:38px;cursor:pointer;border-radius:0;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity));padding:.5rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.active.custom-dropdown-btn:hover{--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .active.custom-dropdown-btn){border-color:rgb(98 117 148/var(--tw-border-opacity));background-color:rgb(11 85 119/var(--tw-bg-opacity));color:rgb(233 236 239/var(--tw-text-opacity))}.regular-input,:is(.dark .active.custom-dropdown-btn){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1}.regular-input{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.5rem;border-width:1px;border-style:solid;border-color:rgb(210 214 218/var(--tw-border-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:padding-box;padding:.25rem .375rem;font-size:.875rem;font-weight:400;line-height:1.4rem;color:rgb(73 80 87/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px;transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.regular-input::-moz-placeholder{--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.regular-input::placeholder{--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.regular-input:focus{border-color:#d2d6da00;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.regular-input:valid:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.regular-input:invalid:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(245 57 57/var(--tw-ring-opacity))}.regular-input:disabled{--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));opacity:.75}:is(.dark .regular-input){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .regular-input:disabled){--tw-border-opacity:1;border-color:rgb(37 47 64/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 47 64/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}@media (min-width:768px){.regular-input{padding:.5rem .75rem}}.invalid.regular-input{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important;--tw-ring-opacity:1!important;--tw-ring-color:rgb(245 57 57/var(--tw-ring-opacity))!important}.input-title{margin:0;font-size:.875rem;line-height:1.5rem;font-weight:700;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .input-title){--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}.popover-settings-container{position:fixed;z-index:1000;height:-moz-fit-content;height:fit-content;max-width:250px;--tw-translate-y:-1.75rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:.375rem;--tw-bg-opacity:1;background-color:rgb(94 114 228/var(--tw-bg-opacity));padding:.75rem;transition-property:all;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.5s}:is(.dark .popover-settings-container){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.popover-tab{position:absolute;left:0;bottom:0;z-index:50;--tw-translate-y:-1.75rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:.375rem;--tw-bg-opacity:1;background-color:rgb(94 114 228/var(--tw-bg-opacity));padding:.75rem;transition-property:all;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.5s}:is(.dark .popover-tab){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.popover-settings-text{margin:0;font-size:.875rem;line-height:1.5rem;font-weight:700;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}.popover-settings-text,:is(.dark .popover-settings-text){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.popover-settings-svg{margin-left:.5rem;height:1.25rem;width:1.25rem;cursor:pointer;fill:#5e72e4}.popover-settings-svg:hover{--tw-brightness:brightness(.75);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.popover-settings-svg-multiple{margin-left:.5rem;height:1.375rem;width:1.375rem;cursor:pointer;fill:#fb6340;stroke:#495057}.popover-settings-svg-multiple:hover{--tw-brightness:brightness(.75);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .popover-settings-svg-multiple){stroke:#adb5bd}.hidden-multiple{display:none!important}.active.tabs-tab-btn,.active.tabs-tab-btn:hover{--tw-bg-opacity:1;background-color:rgb(233 236 239/var(--tw-bg-opacity))}:is(.dark .active.tabs-tab-btn),:is(.dark .active.tabs-tab-btn:hover){--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity))}.tabs-tab-btn{position:relative;margin-top:.25rem;margin-bottom:.25rem;cursor:pointer;border-radius:0;border-width:1px;--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.75rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:-.025rem;--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.tabs-tab-btn,.tabs-tab-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.tabs-tab-btn:hover{--tw-bg-opacity:1;background-color:rgb(235 239 244/var(--tw-bg-opacity));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}:is(.dark .tabs-tab-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity))}:is(.dark .tabs-tab-btn:hover){--tw-bg-opacity:1;background-color:rgb(58 65 111/var(--tw-bg-opacity))}.tabs-name{padding-left:.75rem;padding-right:.5rem;--tw-text-opacity:1;color:rgb(11 85 119/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .tabs-name){--tw-text-opacity:1;color:rgb(235 239 244/var(--tw-text-opacity))}.tabs-popover-container{position:absolute;top:60px;left:0;z-index:50;min-width:150px;border-radius:.375rem;--tw-bg-opacity:1;background-color:rgb(94 114 228/var(--tw-bg-opacity));padding:.75rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}:is(.dark .tabs-popover-container){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.tabs-popover-text{margin:0;font-size:.875rem;line-height:1.5rem;font-weight:700;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.settings-tabs-select-btn{margin-top:.25rem;margin-bottom:.25rem;display:flex;width:100%;cursor:pointer;align-items:center;justify-content:space-between;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.5rem 1rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:-.025rem;--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.settings-tabs-select-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1;background-color:rgb(248 249 250/var(--tw-bg-opacity));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .settings-tabs-select-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity))}:is(.dark .settings-tabs-select-btn:hover){--tw-brightness:brightness(.95);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:768px){.settings-tabs-select-btn{padding:.75rem 1.5rem}}.settings-tabs-select-btn-text{--tw-text-opacity:1;color:rgb(11 85 119/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .settings-tabs-select-btn-text){--tw-text-opacity:1;color:rgb(206 212 218/var(--tw-text-opacity))}.active.settings-tabs-select-dropdown-btn{position:relative;z-index:1000;margin-top:0;margin-bottom:0;cursor:pointer;border-radius:0;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity));padding:.5rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.active.settings-tabs-select-dropdown-btn:hover{--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .active.settings-tabs-select-dropdown-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .active.settings-tabs-select-dropdown-btn:hover){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.first.settings-tabs-select-dropdown-btn{border-top-left-radius:.25rem;border-top-right-radius:.25rem;border-width:1px}.last.settings-tabs-select-dropdown-btn{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.settings-tabs-select-dropdown-btn{position:relative;margin-top:0;margin-bottom:0;display:flex;cursor:pointer;justify-content:space-between;border-radius:0;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.5rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.settings-tabs-select-dropdown-btn:hover{--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .settings-tabs-select-dropdown-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .settings-tabs-select-dropdown-btn:hover){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.home-card{grid-column:span 12/span 12;display:flex;width:100%;justify-content:space-between;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.home-card:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .home-card){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:576px){.home-card{max-height:7rem}}@media (min-width:768px){.home-card{grid-column:span 6/span 6}}@media (min-width:1320px){.home-card{grid-column:span 4/span 4}}.home-card-name{margin-bottom:0;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;font-weight:600;text-transform:uppercase;line-height:1.5}:is(.dark .home-card-name){--tw-text-opacity:1;color:rgb(206 212 218/var(--tw-text-opacity))}.home-card-title{margin-bottom:.25rem;font-weight:700}:is(.dark .home-card-title){color:#ffffffe6}.home-card-subtitle{margin-left:.125rem;margin-right:.125rem;margin-bottom:0;font-size:.875rem;line-height:1.5rem;font-weight:700;line-height:1.5}.info.home-card-subtitle{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.error.home-card-subtitle{--tw-text-opacity:1;color:rgb(245 57 57/var(--tw-text-opacity))}.success.home-card-subtitle{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.warning.home-card-subtitle{--tw-text-opacity:1;color:rgb(251 177 64/var(--tw-text-opacity))}.home-card-svg-container{display:inline-block;height:3rem;width:3rem;border-radius:50%;text-align:center}:is(.dark .home-card-svg-container){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.version.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(251 177 64/var(--tw-bg-opacity))}.version-number.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(45 206 137/var(--tw-bg-opacity))}.instances.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(108 117 125/var(--tw-bg-opacity))}.services.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(251 99 64/var(--tw-bg-opacity))}.plugins.home-card-svg-container{--tw-bg-opacity:1;background-color:rgb(251 207 51/var(--tw-bg-opacity))}.card-detail-container{margin-top:1rem;margin-bottom:1.5rem;margin-left:.25rem;display:grid;grid-template-columns:repeat(1,minmax(0,1fr));gap:.5rem}.card-detail-item{grid-column:span 1/span 1;display:flex;align-items:center;padding-top:.25rem;padding-bottom:.25rem}@media (min-width:576px){.card-detail-item{padding-top:0;padding-bottom:0}}.card-detail-item-title{margin-bottom:0;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .card-detail-item-title){--tw-text-opacity:1;color:rgb(173 181 189/var(--tw-text-opacity))}.card-detail-item-subtitle{grid-column:span 1/span 1;margin-bottom:0;word-break:break-all;padding-left:.5rem;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;font-weight:600;text-transform:uppercase;line-height:1.5;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .card-detail-item-subtitle){--tw-text-opacity:1;color:rgb(235 239 244/var(--tw-text-opacity))}.core-layout{grid-column:span 12/span 12;display:grid;grid-template-columns:repeat(12,minmax(0,1fr))}.core-card{position:relative;grid-column:span 12/span 12;margin:.5rem;height:-moz-fit-content;height:fit-content;min-width:0;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.core-card:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .core-card){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:768px){.core-card{grid-column:span 6/span 6}}@media (min-width:1320px){.core-card{grid-column:span 4/span 4}}@media (min-width:1920px){.core-card{grid-column:span 3/span 3}}.core-card-lg{position:relative;grid-column:span 12/span 12;margin:.5rem;height:-moz-fit-content;height:fit-content;min-width:0;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.core-card-lg:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .core-card-lg){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:768px){.core-card-lg{grid-column:span 6/span 6}}.core-card-wrap{display:flex;justify-content:space-between}.core-card-wrap-logo{display:flex;align-items:center;justify-content:flex-start}.core-card-text{margin-bottom:0;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;line-height:1.5;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .core-card-text){--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}.core-card-text-doc{margin-top:1rem;margin-bottom:.5rem;padding-left:.25rem;padding-right:.25rem;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;line-height:1.5;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.3s;transition-timing-function:ease-in-out}:is(.dark .core-card-text-doc){--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}.core-card-text-doc-link{margin-top:.5rem;cursor:pointer;--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity));text-decoration-line:underline}.core-card-text-doc-link:hover{--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.center.core-card-text{text-align:center}.core-card-title{margin-bottom:.5rem;font-weight:700}:is(.dark .core-card-title){color:#ffffffe6}.core-card-svg-container{display:inline-block;height:3rem;width:3rem;border-radius:50%;text-align:center}:is(.dark .core-card-svg-container){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.core-card-deactivated-title{font-weight:700}:is(.dark .core-card-deactivated-title){color:#ffffffe6}.core-card-deactivated-svg{position:relative;fill:#fbb140;stroke:#fff;font-size:1.125rem;line-height:1.75rem;line-height:1}.core-card-text-container{margin:.75rem .25rem;display:flex;align-items:center;justify-content:flex-start}.core-card-status{position:relative;grid-column:span 12/span 12;margin:.5rem;height:-moz-fit-content;height:fit-content;width:-moz-fit-content;width:fit-content;min-width:0;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.core-card-status:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .core-card-status){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:768px){.core-card-status{grid-column:span 6/span 6}}@media (min-width:1320px){.core-card-status{grid-column:span 3/span 3}}@media (min-width:1920px){.core-card-status{grid-column:span 2/span 2}}.core-card-status-container{margin-left:.25rem;margin-right:.25rem;display:flex;align-items:center;justify-content:flex-start}.core-card-status-title{margin-bottom:0;margin-right:1rem;font-weight:700}:is(.dark .core-card-status-title){color:#ffffffe6}.core-card-status-svg{height:1.5rem;width:1.5rem}.info.core-card-status-svg{fill:#0ea5e9}.error.core-card-status-svg{fill:#f53939}.success.core-card-status-svg{fill:#22c55e}.core-layout-separator{grid-column:span 12/span 12}.core-card-list{position:relative;grid-column:span 12/span 12;margin:.5rem;display:grid;max-height:25rem;grid-template-columns:repeat(12,minmax(0,1fr));align-content:flex-start;overflow-y:auto;overflow-x:hidden;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color)}.core-card-list,:is(.dark .core-card-list){box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .core-card-list){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:576px){.core-card-list{max-height:31.25rem}}@media (min-width:768px){.core-card-list{grid-column:span 6/span 6}}.core-card-list.no-data{place-content:stretch}.core-card-list-no-data{margin-bottom:0;padding-bottom:2rem;text-align:center;font-size:1.5rem;line-height:2rem}@media (min-width:768px){.w-small.core-card-list{max-width:300px}.w-medium.core-card-list{max-width:400px}.w-large.core-card-list{max-width:550px}}.core-card-list-title-container{grid-column:span 12/span 12;display:flex}.core-card-list-title{margin:.5rem .5rem 1rem;font-weight:700}:is(.dark .core-card-list-title){color:#ffffffe6}.core-card-list-container{grid-column:span 12/span 12;overflow-x:auto;overflow-y:auto}.core-card-list-header{margin:0;height:2rem;border-bottom-width:1px;--tw-border-opacity:1;border-color:rgb(206 212 218/var(--tw-border-opacity));padding-bottom:.5rem;font-size:.875rem;line-height:1.5rem;font-weight:700}:is(.dark .core-card-list-header){--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}.core-card-list-item{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));align-items:center;border-bottom-width:1px;--tw-border-opacity:1;border-color:rgb(210 214 218/var(--tw-border-opacity));padding-top:.625rem;padding-bottom:.625rem}.core-card-list-item-content{margin:.25rem 0;font-size:.875rem;line-height:1.5rem}:is(.dark .core-card-list-item-content){--tw-text-opacity:1;color:rgb(206 212 218/var(--tw-text-opacity))}.core-card-list-wrap{display:grid;width:100%;grid-template-columns:repeat(12,minmax(0,1fr));border-radius:.25rem;padding:.5rem}.w-small.core-card-list-wrap{min-width:200px}.w-medium.core-card-list-wrap{min-width:300px}.w-large.core-card-list-wrap{min-width:450px}.core-card-metrics{grid-column:span 12/span 12;margin:.5rem;display:flex;height:-moz-fit-content;height:fit-content;justify-content:space-between;overflow-wrap:break-word;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));background-clip:initial;padding:1rem;--tw-shadow:0 0 2rem 0 #8898aa26;--tw-shadow-colored:0 0 2rem 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:ease;transition-duration:.15s}.core-card-metrics:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .core-card-metrics){--tw-bg-opacity:1;background-color:rgb(17 28 68/var(--tw-bg-opacity));--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:576px){.core-card-metrics{max-height:7rem}}@media (min-width:768px){.core-card-metrics{grid-column:span 6/span 6}}@media (min-width:1320px){.core-card-metrics{grid-column:span 4/span 4}}.core-card-metrics-name{margin-bottom:.5rem;font-family:Open Sans;font-size:.875rem;line-height:1.5rem;font-weight:600;text-transform:uppercase;line-height:1.5}:is(.dark .core-card-metrics-name){--tw-text-opacity:1;color:rgb(206 212 218/var(--tw-text-opacity))}.core-card-metrics-subtitle{margin-bottom:0}:is(.dark .core-card-metrics-subtitle){--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}.core-card-metrics-subtitle-content{margin-left:.125rem;margin-right:.125rem;font-size:.875rem;line-height:1.5rem;font-weight:700;line-height:1.5}.error.core-card-metrics-subtitle-content{--tw-text-opacity:1;color:rgb(245 57 57/var(--tw-text-opacity))}.success.core-card-metrics-subtitle-content{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.warning.core-card-metrics-subtitle-content{--tw-text-opacity:1;color:rgb(251 177 64/var(--tw-text-opacity))}.info.core-card-metrics-subtitle-content{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.core-card-metrics-svg{position:relative;fill:#fff;font-size:1.125rem;line-height:1.75rem;line-height:1}.size-small.core-card-metrics-svg{--tw-scale-x:0.5;--tw-scale-y:0.5}.size-medium.core-card-metrics-svg,.size-small.core-card-metrics-svg{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.size-medium.core-card-metrics-svg{--tw-scale-x:0.6;--tw-scale-y:0.6}.size-base.core-card-metrics-svg{--tw-scale-x:0.75;--tw-scale-y:0.75;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.purple.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.green.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.red.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.orange.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(245 96 54/var(--tw-bg-opacity))}.blue.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(33 82 255/var(--tw-bg-opacity))}.yellow.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.gray.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(108 117 125/var(--tw-bg-opacity))}.dark.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(98 117 148/var(--tw-bg-opacity))}.amber.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.emerald.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.teal.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.indigo.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.cyan.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.sky.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.pink.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.lime.core-card-svg-container{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.core-separator{margin:.75rem 0 .5rem;height:1px;background-color:initial;--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to);--tw-gradient-stops:var(--tw-gradient-from),#0006 var(--tw-gradient-via-position),var(--tw-gradient-to);--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.core-separator,:is(.dark .core-separator){background-image:linear-gradient(to right,var(--tw-gradient-stops))}:is(.dark .core-separator){--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#fff var(--tw-gradient-via-position),var(--tw-gradient-to);--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.core-card-test-container{margin-top:1rem;display:flex;justify-content:center}.core-card-test-btn{display:inline-block;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(251 177 64/var(--tw-bg-opacity));padding:.75rem 1.5rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.core-card-test-btn,.core-card-test-btn:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.core-card-test-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));background-color:#fbb140cc;--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)}.core-card-test-btn:focus{background-color:#fbb140cc}.core-card-test-btn:active{opacity:.85}.core-card-test-btn:disabled{cursor:not-allowed;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.core-card-test-btn:disabled,.core-card-test-btn:hover:disabled{border-color:#ced4da00;background-color:rgb(206 212 218/var(--tw-bg-opacity))}.core-card-test-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1}:is(.dark .core-card-test-btn){--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .core-card-test-btn:disabled){border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .core-card-test-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity))}.core-card-upload-btn{display:inline-block;width:-moz-fit-content;width:fit-content;cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(11 85 119/var(--tw-bg-opacity));background-image:linear-gradient(to top left,var(--tw-gradient-stops));background-size:150%;background-position:25% 0;padding:.75rem 1.5rem;text-align:center;vertical-align:middle;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.core-card-upload-btn:hover{--tw-translate-y:-1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-brightness:brightness(.75);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.core-card-upload-btn:active{opacity:.85}.core-card-upload-btn:disabled{cursor:not-allowed;--tw-border-opacity:1;border-color:rgb(206 212 218/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity));opacity:.75}.core-card-upload-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:is(.dark .core-card-upload-btn){--tw-brightness:brightness(1.25);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .core-card-upload-btn:disabled){--tw-border-opacity:1;border-color:rgb(37 47 64/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(37 47 64/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}.core-card-test-status-container{margin-left:.25rem;margin-right:.25rem;display:flex;align-items:center;justify-content:center}.core-card-test-status-svg{margin-right:.5rem;height:1.5rem;width:1.5rem}.success.core-card-test-status-svg{fill:#22c55e}.error.core-card-test-status-svg{fill:#f53939}.info.core-card-test-status-svg{fill:#0ea5e9}.core-img-default{margin-right:1rem;height:3rem;width:3rem}.core-img-hor{margin-right:1rem;height:4rem;width:6rem}.file-manager-actions-item-btn{position:relative;margin:.25rem;cursor:pointer;white-space:nowrap;border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(11 85 119/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));padding:.75rem 1.25rem .625rem 1rem;text-align:center;vertical-align:middle;font-size:.875rem;line-height:1.5rem;font-weight:700;text-transform:uppercase;line-height:1.5;letter-spacing:-.025rem;--tw-text-opacity:1;color:rgb(11 85 119/var(--tw-text-opacity));--tw-shadow:0 7px 14px #32325d1a,0 3px 6px #00000014;--tw-shadow-colored:0 7px 14px var(--tw-shadow-color),0 3px 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:all;transition-timing-function:ease;transition-duration:.15s;transition-timing-function:ease-in}.file-manager-actions-item-btn:hover{--tw-bg-opacity:1;background-color:rgb(235 239 244/var(--tw-bg-opacity));--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.file-manager-actions-item-btn:disabled{cursor:not-allowed;border-color:#ced4da00;--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(73 80 87/var(--tw-text-opacity))}.file-manager-actions-item-btn:hover:disabled{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-color:#ced4da00;--tw-bg-opacity:1;background-color:rgb(206 212 218/var(--tw-bg-opacity))}:is(.dark .file-manager-actions-item-btn){--tw-border-opacity:1;border-color:rgb(98 117 148/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(52 71 103/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(233 236 239/var(--tw-text-opacity))}:is(.dark .file-manager-actions-item-btn:hover){--tw-bg-opacity:1;background-color:rgb(58 65 111/var(--tw-bg-opacity))}:is(.dark .file-manager-actions-item-btn:disabled){border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(210 214 218/var(--tw-text-opacity))}:is(.dark .file-manager-actions-item-btn:hover:disabled){--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-color:#49505700;--tw-bg-opacity:1;background-color:rgb(73 80 87/var(--tw-bg-opacity))}@media (min-width:768px){.file-manager-actions-item-btn{display:block}}.first-letter\:absolute:first-letter{position:absolute!important}.first-letter\:w-full:first-letter{width:100%!important}.placeholder\:text-gray-500::-moz-placeholder{--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}.placeholder\:text-gray-500::placeholder{--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}.before\:float-left:before{content:var(--tw-content)!important;float:left!important}.before\:pr-2:before{content:var(--tw-content)!important;padding-right:.5rem!important}.before\:text-white:before{content:var(--tw-content)!important;--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.before\:content-\[\'\/\'\]:before{--tw-content:"/"!important;content:var(--tw-content)!important}.after\:absolute:after{content:var(--tw-content)!important;position:absolute!important}.after\:top-px:after{content:var(--tw-content)!important;top:1px!important}.after\:float-right:after{content:var(--tw-content)!important;float:right!important}.after\:h-4:after{content:var(--tw-content)!important;height:1rem!important}.after\:w-4:after{content:var(--tw-content)!important;width:1rem!important}.after\:translate-x-px:after{content:var(--tw-content)!important;--tw-translate-x:1px!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.after\:rounded-circle:after{content:var(--tw-content)!important;border-radius:50%!important}.after\:bg-white:after{content:var(--tw-content)!important;--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.after\:pl-2:after{content:var(--tw-content)!important;padding-left:.5rem!important}.after\:text-gray-600:after{content:var(--tw-content)!important;--tw-text-opacity:1!important;color:rgb(108 117 125/var(--tw-text-opacity))!important}.after\:shadow-2xl:after{content:var(--tw-content)!important;--tw-shadow:0 .3125rem .625rem 0 #0000001f!important;--tw-shadow-colored:0 .3125rem .625rem 0 var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.after\:duration-300:after{content:var(--tw-content)!important;transition-duration:.3s!important}.after\:content-\[\'\'\]:after{--tw-content:""!important;content:var(--tw-content)!important}.after\:content-\[\'\/\'\]:after{--tw-content:"/"!important;content:var(--tw-content)!important}.checked\:z-0:checked{z-index:0!important}.checked\:border-primary:checked{--tw-border-opacity:1!important;border-color:rgb(11 85 119/var(--tw-border-opacity))!important}.checked\:bg-primary:checked{--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important}.checked\:bg-none:checked{background-image:none!important}.checked\:bg-right:checked{background-position:100%!important}.checked\:after\:translate-x-5:checked:after{--tw-translate-x:1.25rem!important}.checked\:after\:translate-x-5:checked:after,.checked\:after\:translate-x-5\.3:checked:after{content:var(--tw-content)!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.checked\:after\:translate-x-5\.3:checked:after{--tw-translate-x:1.3rem!important}.valid\:\!border-red-500:valid{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.hover\:-translate-y-0:hover{--tw-translate-y:-0px!important}.hover\:-translate-y-0:hover,.hover\:-translate-y-0\.4:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.hover\:-translate-y-0\.4:hover{--tw-translate-y:-0.1rem!important}.hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem!important}.hover\:-translate-y-0\.5:hover,.hover\:-translate-y-px:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.hover\:-translate-y-px:hover{--tw-translate-y:-1px!important}.hover\:scale-102:hover{--tw-scale-x:1.02!important;--tw-scale-y:1.02!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.hover\:rounded-lg:hover{border-radius:.5rem!important}.hover\:bg-emerald-500:hover{--tw-bg-opacity:1!important;background-color:rgb(45 206 137/var(--tw-bg-opacity))!important}.hover\:bg-emerald-500\/80:hover{background-color:#2dce89cc!important}.hover\:bg-gray-100:hover{--tw-bg-opacity:1!important;background-color:rgb(235 239 244/var(--tw-bg-opacity))!important}.hover\:bg-gray-100\/10:hover{background-color:#ebeff41a!important}.hover\:bg-gray-300:hover{--tw-bg-opacity:1!important;background-color:rgb(210 214 218/var(--tw-bg-opacity))!important}.hover\:bg-gray-500:hover{--tw-bg-opacity:1!important;background-color:rgb(173 181 189/var(--tw-bg-opacity))!important}.hover\:bg-gray-500\/80:hover{background-color:#adb5bdcc!important}.hover\:bg-gray-600:hover{--tw-bg-opacity:1!important;background-color:rgb(108 117 125/var(--tw-bg-opacity))!important}.hover\:bg-gray-600\/80:hover{background-color:#6c757dcc!important}.hover\:bg-green-500:hover{--tw-bg-opacity:1!important;background-color:rgb(34 197 94/var(--tw-bg-opacity))!important}.hover\:bg-green-500\/80:hover{background-color:#22c55ecc!important}.hover\:bg-orange-500:hover{--tw-bg-opacity:1!important;background-color:rgb(251 99 64/var(--tw-bg-opacity))!important}.hover\:bg-orange-500\/80:hover{background-color:#fb6340cc!important}.hover\:bg-primary\/30:hover{background-color:#0b55774d!important}.hover\:bg-primary\/5:hover{background-color:#0b55770d!important}.hover\:bg-primary\/80:hover{background-color:#0b5577cc!important}.hover\:bg-red-500:hover{--tw-bg-opacity:1!important;background-color:rgb(245 57 57/var(--tw-bg-opacity))!important}.hover\:bg-red-500\/80:hover{background-color:#f53939cc!important}.hover\:bg-sky-500:hover{--tw-bg-opacity:1!important;background-color:rgb(14 165 233/var(--tw-bg-opacity))!important}.hover\:bg-sky-500\/80:hover{background-color:#0ea5e9cc!important}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1!important;background-color:rgb(251 207 51/var(--tw-bg-opacity))!important}.hover\:bg-yellow-400\/80:hover{background-color:#fbcf33cc!important}.hover\:bg-yellow-500:hover{--tw-bg-opacity:1!important;background-color:rgb(251 177 64/var(--tw-bg-opacity))!important}.hover\:bg-yellow-500\/80:hover{background-color:#fbb140cc!important}.hover\:italic:hover{font-style:italic!important}.hover\:no-underline:hover{text-decoration-line:none!important}.hover\:opacity-80:hover{opacity:.8!important}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px #32325d1a,0 1px 3px #00000014!important;--tw-shadow-colored:0 4px 6px var(--tw-shadow-color),0 1px 3px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.hover\:brightness-75:hover{--tw-brightness:brightness(.75)!important}.hover\:brightness-75:hover,.hover\:brightness-90:hover{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.hover\:brightness-90:hover{--tw-brightness:brightness(.9)!important}.hover\:brightness-95:hover{--tw-brightness:brightness(.95)!important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.focus\:\!border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.focus\:border-green-500:focus{--tw-border-opacity:1!important;border-color:rgb(34 197 94/var(--tw-border-opacity))!important}.focus\:border-primary:focus{--tw-border-opacity:1!important;border-color:rgb(11 85 119/var(--tw-border-opacity))!important}.focus\:bg-emerald-500:focus{--tw-bg-opacity:1!important;background-color:rgb(45 206 137/var(--tw-bg-opacity))!important}.focus\:bg-emerald-500\/80:focus{background-color:#2dce89cc!important}.focus\:bg-gray-500:focus{--tw-bg-opacity:1!important;background-color:rgb(173 181 189/var(--tw-bg-opacity))!important}.focus\:bg-gray-500\/80:focus{background-color:#adb5bdcc!important}.focus\:bg-gray-600:focus{--tw-bg-opacity:1!important;background-color:rgb(108 117 125/var(--tw-bg-opacity))!important}.focus\:bg-gray-600\/80:focus{background-color:#6c757dcc!important}.focus\:bg-green-500:focus{--tw-bg-opacity:1!important;background-color:rgb(34 197 94/var(--tw-bg-opacity))!important}.focus\:bg-green-500\/80:focus{background-color:#22c55ecc!important}.focus\:bg-orange-500:focus{--tw-bg-opacity:1!important;background-color:rgb(251 99 64/var(--tw-bg-opacity))!important}.focus\:bg-orange-500\/80:focus{background-color:#fb6340cc!important}.focus\:bg-primary\/80:focus{background-color:#0b5577cc!important}.focus\:bg-red-500:focus{--tw-bg-opacity:1!important;background-color:rgb(245 57 57/var(--tw-bg-opacity))!important}.focus\:bg-red-500\/80:focus{background-color:#f53939cc!important}.focus\:bg-sky-500:focus{--tw-bg-opacity:1!important;background-color:rgb(14 165 233/var(--tw-bg-opacity))!important}.focus\:bg-sky-500\/80:focus{background-color:#0ea5e9cc!important}.focus\:bg-yellow-400:focus{--tw-bg-opacity:1!important;background-color:rgb(251 207 51/var(--tw-bg-opacity))!important}.focus\:bg-yellow-400\/80:focus{background-color:#fbcf33cc!important}.focus\:bg-yellow-500:focus{--tw-bg-opacity:1!important;background-color:rgb(251 177 64/var(--tw-bg-opacity))!important}.focus\:bg-yellow-500\/80:focus{background-color:#fbb140cc!important}.focus\:outline:focus{outline-style:solid!important}.focus\:\!ring-red-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(245 57 57/var(--tw-ring-opacity))!important}.focus\:valid\:\!border-red-500:valid:focus{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.focus\:valid\:border-green-500:valid:focus{--tw-border-opacity:1!important;border-color:rgb(34 197 94/var(--tw-border-opacity))!important}.focus\:valid\:\!ring-red-500:valid:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(245 57 57/var(--tw-ring-opacity))!important}.focus\:invalid\:border-red-500:invalid:focus{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.focus\:file\:invalid\:border-red-500:invalid::file-selector-button:focus{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.active\:\!border-red-500:active{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.active\:opacity-85:active{opacity:.85!important}.active\:valid\:\!border-red-500:valid:active{--tw-border-opacity:1!important;border-color:rgb(245 57 57/var(--tw-border-opacity))!important}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed!important}.disabled\:border-gray-400:disabled{--tw-border-opacity:1!important;border-color:rgb(206 212 218/var(--tw-border-opacity))!important}.disabled\:border-gray-400\/0:disabled{border-color:#ced4da00!important}.disabled\:bg-gray-400:disabled{--tw-bg-opacity:1!important;background-color:rgb(206 212 218/var(--tw-bg-opacity))!important}.disabled\:text-gray-700:disabled{--tw-text-opacity:1!important;color:rgb(73 80 87/var(--tw-text-opacity))!important}.disabled\:opacity-75:disabled{opacity:.75!important}.disabled\:hover\:translate-y-0:hover:disabled{--tw-translate-y:0px!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.disabled\:hover\:border-gray-400\/0:hover:disabled{border-color:#ced4da00!important}.disabled\:hover\:bg-gray-400:hover:disabled{--tw-bg-opacity:1!important;background-color:rgb(206 212 218/var(--tw-bg-opacity))!important}.group:hover .group-hover\:z-10{z-index:10!important}.group:hover .group-hover\:opacity-100{opacity:1!important}:is(.dark .dark\:inline){display:inline!important}:is(.dark .dark\:hidden){display:none!important}:is(.dark .dark\:border-gray-200){--tw-border-opacity:1!important;border-color:rgb(233 236 239/var(--tw-border-opacity))!important}:is(.dark .dark\:border-gray-300){--tw-border-opacity:1!important;border-color:rgb(210 214 218/var(--tw-border-opacity))!important}:is(.dark .dark\:border-gray-700){--tw-border-opacity:1!important;border-color:rgb(73 80 87/var(--tw-border-opacity))!important}:is(.dark .dark\:border-slate-600){--tw-border-opacity:1!important;border-color:rgb(98 117 148/var(--tw-border-opacity))!important}:is(.dark .dark\:border-slate-800){--tw-border-opacity:1!important;border-color:rgb(58 65 111/var(--tw-border-opacity))!important}:is(.dark .dark\:bg-gray-400){--tw-bg-opacity:1!important;background-color:rgb(206 212 218/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-gray-800){--tw-bg-opacity:1!important;background-color:rgb(37 47 64/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-green-500\/90){background-color:#22c55ee6!important}:is(.dark .dark\:bg-primary){--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-primary\/50){background-color:#0b557780!important}:is(.dark .dark\:bg-red-500\/90){background-color:#f53939e6!important}:is(.dark .dark\:bg-slate-700){--tw-bg-opacity:1!important;background-color:rgb(52 71 103/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-slate-700\/50){background-color:#34476780!important}:is(.dark .dark\:bg-slate-800){--tw-bg-opacity:1!important;background-color:rgb(58 65 111/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-slate-850){--tw-bg-opacity:1!important;background-color:rgb(17 28 68/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-slate-900){--tw-bg-opacity:1!important;background-color:rgb(5 17 57/var(--tw-bg-opacity))!important}:is(.dark .dark\:bg-slate-900\/30){background-color:#0511394d!important}:is(.dark .dark\:bg-gradient-to-r){background-image:linear-gradient(to right,var(--tw-gradient-stops))!important}:is(.dark .dark\:from-transparent){--tw-gradient-from:#0000 var(--tw-gradient-from-position)!important;--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)!important}:is(.dark .dark\:via-white){--tw-gradient-to:#fff0 var(--tw-gradient-to-position)!important;--tw-gradient-stops:var(--tw-gradient-from),#fff var(--tw-gradient-via-position),var(--tw-gradient-to)!important}:is(.dark .dark\:to-transparent){--tw-gradient-to:#0000 var(--tw-gradient-to-position)!important}:is(.dark .dark\:fill-blue-500){fill:#5e72e4!important}:is(.dark .dark\:fill-gray-300){fill:#d2d6da!important}:is(.dark .dark\:fill-gray-500){fill:#adb5bd!important}:is(.dark .dark\:fill-gray-600){fill:#6c757d!important}:is(.dark .dark\:stroke-amber-500){stroke:#f59e0b!important}:is(.dark .dark\:stroke-gray-300){stroke:#d2d6da!important}:is(.dark .dark\:stroke-gray-400){stroke:#ced4da!important}:is(.dark .dark\:stroke-gray-600){stroke:#6c757d!important}:is(.dark .dark\:stroke-red-500){stroke:#f53939!important}:is(.dark .dark\:stroke-white\/90){stroke:#ffffffe6!important}:is(.dark .dark\:text-gray-100){--tw-text-opacity:1!important;color:rgb(235 239 244/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-200){--tw-text-opacity:1!important;color:rgb(233 236 239/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-300){--tw-text-opacity:1!important;color:rgb(210 214 218/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-400){--tw-text-opacity:1!important;color:rgb(206 212 218/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-50){--tw-text-opacity:1!important;color:rgb(248 249 250/var(--tw-text-opacity))!important}:is(.dark .dark\:text-gray-500){--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}:is(.dark .dark\:text-white){--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}:is(.dark .dark\:text-white\/80){color:#fffc!important}:is(.dark .dark\:text-white\/90){color:#ffffffe6!important}:is(.dark .dark\:opacity-100){opacity:1!important}:is(.dark .dark\:opacity-60){opacity:.6!important}:is(.dark .dark\:opacity-80){opacity:.8!important}:is(.dark .dark\:opacity-90){opacity:.9!important}:is(.dark .dark\:shadow-dark-xl){--tw-shadow:0 2px 2px 0 #00000024,0 3px 1px -2px #0003,0 1px 5px 0 #0000001f!important;--tw-shadow-colored:0 2px 2px 0 var(--tw-shadow-color),0 3px 1px -2px var(--tw-shadow-color),0 1px 5px 0 var(--tw-shadow-color)!important}:is(.dark .dark\:shadow-dark-xl),:is(.dark .dark\:shadow-none){box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}:is(.dark .dark\:shadow-none){--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}:is(.dark .dark\:brightness-110){--tw-brightness:brightness(1.1)!important}:is(.dark .dark\:brightness-110),:is(.dark .dark\:brightness-125){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:brightness-125){--tw-brightness:brightness(1.25)!important}:is(.dark .dark\:brightness-90){--tw-brightness:brightness(.9)!important}:is(.dark .dark\:brightness-90),:is(.dark .dark\:brightness-95){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:brightness-95){--tw-brightness:brightness(.95)!important}:is(.dark .dark\:brightness-\[0\.885\]){--tw-brightness:brightness(0.885)!important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:placeholder\:text-gray-600)::-moz-placeholder{--tw-text-opacity:1!important;color:rgb(108 117 125/var(--tw-text-opacity))!important}:is(.dark .dark\:placeholder\:text-gray-600)::placeholder{--tw-text-opacity:1!important;color:rgb(108 117 125/var(--tw-text-opacity))!important}:is(.dark .dark\:after\:text-gray-300):after{content:var(--tw-content)!important;--tw-text-opacity:1!important;color:rgb(210 214 218/var(--tw-text-opacity))!important}:is(.dark .dark\:after\:text-gray-500):after{content:var(--tw-content)!important;--tw-text-opacity:1!important;color:rgb(173 181 189/var(--tw-text-opacity))!important}:is(.dark .dark\:checked\:border-primary:checked){--tw-border-opacity:1!important;border-color:rgb(11 85 119/var(--tw-border-opacity))!important}:is(.dark .dark\:checked\:bg-primary:checked){--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important}:is(.dark .dark\:hover\:bg-primary\/20:hover){background-color:#0b557733!important}:is(.dark .dark\:hover\:bg-primary\/60:hover){background-color:#0b557799!important}:is(.dark .dark\:hover\:bg-slate-700\/50:hover){background-color:#34476780!important}:is(.dark .dark\:hover\:bg-slate-800:hover){--tw-bg-opacity:1!important;background-color:rgb(58 65 111/var(--tw-bg-opacity))!important}:is(.dark .dark\:hover\:brightness-100:hover){--tw-brightness:brightness(1)!important}:is(.dark .dark\:hover\:brightness-100:hover),:is(.dark .dark\:hover\:brightness-105:hover){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:hover\:brightness-105:hover){--tw-brightness:brightness(1.05)!important}:is(.dark .dark\:hover\:brightness-110:hover){--tw-brightness:brightness(1.1)!important}:is(.dark .dark\:hover\:brightness-110:hover),:is(.dark .dark\:hover\:brightness-90:hover){filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}:is(.dark .dark\:hover\:brightness-90:hover){--tw-brightness:brightness(.9)!important}:is(.dark .dark\:disabled\:border-gray-700\/0:disabled){border-color:#49505700!important}:is(.dark .dark\:disabled\:border-gray-800:disabled){--tw-border-opacity:1!important;border-color:rgb(37 47 64/var(--tw-border-opacity))!important}:is(.dark .dark\:disabled\:bg-gray-700:disabled){--tw-bg-opacity:1!important;background-color:rgb(73 80 87/var(--tw-bg-opacity))!important}:is(.dark .dark\:disabled\:bg-gray-800:disabled){--tw-bg-opacity:1!important;background-color:rgb(37 47 64/var(--tw-bg-opacity))!important}:is(.dark .dark\:disabled\:text-gray-300:disabled){--tw-text-opacity:1!important;color:rgb(210 214 218/var(--tw-text-opacity))!important}:is(.dark .dark\:disabled\:text-gray-400:disabled){--tw-text-opacity:1!important;color:rgb(206 212 218/var(--tw-text-opacity))!important}:is(.dark .dark\:disabled\:hover\:translate-y-0:hover:disabled){--tw-translate-y:0px!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}:is(.dark .dark\:disabled\:hover\:border-gray-700\/0:hover:disabled){border-color:#49505700!important}:is(.dark .dark\:disabled\:hover\:bg-gray-700:hover:disabled){--tw-bg-opacity:1!important;background-color:rgb(73 80 87/var(--tw-bg-opacity))!important}@media (min-width:576px){.sm\:right-24{right:6rem!important}.sm\:right-40{right:10rem!important}.sm\:right-6{right:1.5rem!important}.sm\:top-2{top:.5rem!important}.sm\:top-8{top:2rem!important}.sm\:top-\[4\.5rem\]{top:4.5rem!important}.sm\:col-span-4{grid-column:span 4/span 4!important}.sm\:col-span-6{grid-column:span 6/span 6!important}.sm\:col-start-5{grid-column-start:5!important}.sm\:mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.sm\:mx-6{margin-left:1.5rem!important;margin-right:1.5rem!important}.sm\:my-0{margin-top:0!important;margin-bottom:0!important}.sm\:mb-2{margin-bottom:.5rem!important}.sm\:ml-1{margin-left:.25rem!important}.sm\:ml-4{margin-left:1rem!important}.sm\:mr-16{margin-right:4rem!important}.sm\:block{display:block!important}.sm\:inline{display:inline!important}.sm\:flex{display:flex!important}.sm\:h-10{height:2.5rem!important}.sm\:h-14{height:3.5rem!important}.sm\:h-7{height:1.75rem!important}.sm\:max-h-125{max-height:31.25rem!important}.sm\:w-36{width:9rem!important}.sm\:w-50{width:12.5rem!important}.sm\:w-7{width:1.75rem!important}.sm\:min-w-\[250px\]{min-width:250px!important}.sm\:min-w-\[500px\]{min-width:500px!important}.sm\:max-w-\[350px\]{max-width:350px!important}.sm\:translate-x-0{--tw-translate-x:0px!important}.sm\:scale-100,.sm\:translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.sm\:flex-row{flex-direction:row!important}.sm\:items-center{align-items:center!important}.sm\:justify-end{justify-content:flex-end!important}.sm\:justify-items-start{justify-items:start!important}.sm\:gap-4{gap:1rem!important}.sm\:p-3{padding:.75rem!important}.sm\:px-12{padding-left:3rem!important;padding-right:3rem!important}.sm\:px-4{padding-left:1rem!important;padding-right:1rem!important}.sm\:px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.sm\:pt-6{padding-top:1.5rem!important}.sm\:text-left{text-align:left!important}.sm\:text-2xl{font-size:1.5rem!important;line-height:2rem!important}.sm\:text-4xl{font-size:2.25rem!important;line-height:2.5rem!important}.sm\:text-7xl{font-size:4.5rem!important;line-height:1!important}.sm\:text-base{font-size:1rem!important}.sm\:text-base,.sm\:text-sm{line-height:1.5rem!important}.sm\:text-sm{font-size:.875rem!important}}@media (min-width:768px){.md\:absolute{position:absolute!important}.md\:right-8{right:2rem!important}.md\:right-\[3\.75rem\]{right:3.75rem!important}.md\:top-\[40\%\]{top:40%!important}.md\:top-\[53\%\]{top:53%!important}.md\:col-span-4{grid-column:span 4/span 4!important}.md\:col-span-5{grid-column:span 5/span 5!important}.md\:col-span-6{grid-column:span 6/span 6!important}.md\:col-span-7{grid-column:span 7/span 7!important}.md\:col-span-8{grid-column:span 8/span 8!important}.md\:mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.md\:mx-4{margin-left:1rem!important;margin-right:1rem!important}.md\:my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.md\:mb-0{margin-bottom:0!important}.md\:mb-3{margin-bottom:.75rem!important}.md\:mr-3{margin-right:.75rem!important}.md\:mt-0{margin-top:0!important}.md\:mt-6{margin-top:1.5rem!important}.md\:hidden{display:none!important}.md\:h-16{height:4rem!important}.md\:max-h-\[90vh\]{max-height:90vh!important}.md\:min-h-50-screen{min-height:50vh!important}.md\:w-1\/2{width:50%!important}.md\:w-60{width:15rem!important}.md\:max-w-\[700px\]{max-width:700px!important}.md\:-translate-y-20{--tw-translate-y:-5rem!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.md\:flex-row{flex-direction:row!important}.md\:items-end{align-items:flex-end!important}.md\:gap-x-4{-moz-column-gap:1rem!important;column-gap:1rem!important}.md\:gap-x-6{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.md\:px-1{padding-left:.25rem!important;padding-right:.25rem!important}.md\:px-3{padding-left:.75rem!important;padding-right:.75rem!important}.md\:px-4{padding-left:1rem!important;padding-right:1rem!important}.md\:px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.md\:py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.md\:text-base{font-size:1rem!important;line-height:1.5rem!important}}@media (min-width:992px){.lg\:relative{position:relative!important}.lg\:bottom-2{bottom:.5rem!important}.lg\:left-48{left:12rem!important}.lg\:top-24{top:6rem!important}.lg\:order-1{order:1!important}.lg\:order-2{order:2!important}.lg\:col-span-1{grid-column:span 1/span 1!important}.lg\:col-span-4{grid-column:span 4/span 4!important}.lg\:col-span-5{grid-column:span 5/span 5!important}.lg\:col-span-6{grid-column:span 6/span 6!important}.lg\:col-span-8{grid-column:span 8/span 8!important}.lg\:mx-0{margin-left:0!important;margin-right:0!important}.lg\:mx-4{margin-left:1rem!important;margin-right:1rem!important}.lg\:mx-8{margin-left:2rem!important;margin-right:2rem!important}.lg\:my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.lg\:mt-0{margin-top:0!important}.lg\:mt-4{margin-top:1rem!important}.lg\:mt-8{margin-top:2rem!important}.lg\:block{display:block!important}.lg\:inline{display:inline!important}.lg\:flex{display:flex!important}.lg\:hidden{display:none!important}.lg\:h-24{height:6rem!important}.lg\:h-36{height:9rem!important}.lg\:h-9{height:2.25rem!important}.lg\:max-h-\[550px\]{max-height:550px!important}.lg\:w-36{width:9rem!important}.lg\:w-80{width:20rem!important}.lg\:w-9{width:2.25rem!important}.lg\:w-\[400px\]{width:400px!important}.lg\:max-w-\[700px\]{max-width:700px!important}.lg\:translate-x-0{--tw-translate-x:0px!important}.lg\:translate-x-0,.lg\:translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.lg\:translate-y-0{--tw-translate-y:0px!important}.lg\:flex-row{flex-direction:row!important}.lg\:flex-nowrap{flex-wrap:nowrap!important}.lg\:justify-start{justify-content:flex-start!important}.lg\:justify-end{justify-content:flex-end!important}.lg\:justify-between{justify-content:space-between!important}.lg\:gap-6{gap:1.5rem!important}.lg\:bg-gray-50{--tw-bg-opacity:1!important;background-color:rgb(248 249 250/var(--tw-bg-opacity))!important}.lg\:px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.lg\:pb-1{padding-bottom:.25rem!important}.lg\:pb-28{padding-bottom:7rem!important}.lg\:pt-6{padding-top:1.5rem!important}.lg\:text-left{text-align:left!important}.lg\:text-base{font-size:1rem!important}.lg\:text-base,.lg\:text-sm{line-height:1.5rem!important}.lg\:text-sm{font-size:.875rem!important}}@media (min-width:1200px){.xl\:left-0{left:0!important}.xl\:right-24{right:6rem!important}.xl\:right-6{right:1.5rem!important}.xl\:ml-6{margin-left:1.5rem!important}.xl\:ml-68{margin-left:17rem!important}.xl\:hidden{display:none!important}.xl\:h-44{height:11rem!important}.xl\:max-h-\[550px\]{max-height:550px!important}.xl\:w-1\/3{width:33.333333%!important}.xl\:w-44{width:11rem!important}.xl\:w-\[500px\]{width:500px!important}.xl\:max-w-\[1200px\]{max-width:1200px!important}.xl\:translate-x-0{--tw-translate-x:0px!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.xl\:p-1{padding:.25rem!important}.xl\:p-1\.5{padding:.375rem!important}.xl\:pl-75{padding-left:18.75rem!important}.xl\:text-base{font-size:1rem!important;line-height:1.5rem!important}}@media (min-width:1320px){.\32xl\:col-span-4{grid-column:span 4/span 4!important}.\32xl\:col-span-6{grid-column:span 6/span 6!important}.\32xl\:my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.\32xl\:max-w-\[1500px\]{max-width:1500px!important}.\32xl\:text-3xl{font-size:1.875rem!important;line-height:2.25rem!important}.\32xl\:text-5xl{font-size:3rem!important;line-height:1!important}.\32xl\:text-8xl{font-size:5rem!important;line-height:1!important}.\32xl\:text-lg{font-size:1.125rem!important;line-height:1.75rem!important}}@media (min-width:1920px){.\33xl\:col-span-3{grid-column:span 3/span 3!important}.\33xl\:col-span-4{grid-column:span 4/span 4!important}.\33xl\:col-span-5{grid-column:span 5/span 5!important}.\33xl\:inline{display:inline!important}.\33xl\:max-w-none{max-width:none!important}.\33xl\:translate-x-60{--tw-translate-x:15rem!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.\33xl\:text-6xl{font-size:3.75rem!important;line-height:1!important}.\33xl\:text-9xl{font-size:6rem!important;line-height:1!important}.\33xl\:text-xl{font-size:1.25rem!important;line-height:1.75rem!important}}@media (min-width:340px){.xs\:flex-row{flex-direction:row!important}.xs\:items-center{align-items:center!important}.xs\:justify-start{justify-content:flex-start!important}.xs\:pl-2{padding-left:.5rem!important}.xs\:text-base{font-size:1rem!important}.xs\:text-base,.xs\:text-sm{line-height:1.5rem!important}.xs\:text-sm{font-size:.875rem!important}}.\[\&\>\*\]\:bg-primary>*{--tw-bg-opacity:1!important;background-color:rgb(11 85 119/var(--tw-bg-opacity))!important} \ No newline at end of file diff --git a/src/ui/static/js/global.js b/src/ui/static/js/global.js index bbbb58f9a..fe0fb500b 100644 --- a/src/ui/static/js/global.js +++ b/src/ui/static/js/global.js @@ -234,7 +234,7 @@ class darkMode { body: JSON.stringify({ darkmode: isDark }), }; const send = await fetch( - `${location.href.split("/").slice(0, -1).join("/")}/darkmode`, + document.querySelector("[data-mode-link]").getAttribute("data-mode-link"), data, ); } diff --git a/src/ui/static/js/jobs.js b/src/ui/static/js/jobs.js index 2a594115a..13fa64b08 100644 --- a/src/ui/static/js/jobs.js +++ b/src/ui/static/js/jobs.js @@ -360,17 +360,18 @@ class Download { .hasAttribute(`data-${this.prefix}-download`) ) { const btnEl = e.target.closest("button"); + const pluginId = btnEl.getAttribute("data-jobs-plugin"); const jobName = btnEl.getAttribute("data-jobs-download"); const fileName = btnEl.getAttribute("data-jobs-file"); - this.sendFileToDL(jobName, fileName); + this.sendFileToDL(pluginId, jobName, fileName); } } catch (err) {} }); } - async sendFileToDL(jobName, fileName) { + async sendFileToDL(pluginId, jobName, fileName) { window.open( - `${location.href}/download?job_name=${jobName}&file_name=${fileName}`, + `${location.href}/download?plugin_id=${pluginId}&job_name=${jobName}&file_name=${fileName}`, ); } } diff --git a/src/ui/static/js/plugins/utils.js b/src/ui/static/js/plugins/utils.js index 43a994c31..2dbf38d8a 100644 --- a/src/ui/static/js/plugins/utils.js +++ b/src/ui/static/js/plugins/utils.js @@ -1,11 +1,13 @@ class Ping { constructor( url = `${location.origin}${location.pathname}`, - statusTextEl = null, - statusColorEl = null, - key_to_check = "ping", + btnEl = null, // disabled while fethching + statusTextEl = null, // update text with fetching result + statusColorEl = null, // update color with fetching result + key_to_check = "ping", // key to check in response data ) { this.url = url; + this.btnEl = btnEl; this.statusColorEl = statusColorEl; this.statusTextEl = statusTextEl; this.key_to_check = key_to_check; @@ -82,6 +84,30 @@ class Ping { // Key of fetch data need to match key of this.data updateEl(data) { + // Show error + if (data?.error) { + const error = data?.error || "Action exception, no details available"; + console.log(error); + // Remove previous data-action-error + const prevError = document.querySelectorAll("[data-action-error]"); + if (prevError.length) prevError.forEach((el) => el.remove()); + // Add this one + const error_html = `
+
+
+ + + +
+

(Action error) ${error}

+
+ `; + // add HTML at the end of .core-layout + document + .querySelector("div.core-layout") + .insertAdjacentHTML("beforeend", error_html); + } + try { const successValues = [ "success", @@ -141,8 +167,14 @@ class Ping { this.alertEl.classList.remove("hidden"); - if (type !== "fetch") + if (type === "fetch") { + this.btnEl.setAttribute("disabled", "disabled"); + } + + if (type !== "fetch") { + this.btnEl.removeAttribute("disabled"); setTimeout(() => this.alertEl.classList.add("hidden"), 5000); + } } getAlertType(type) { diff --git a/src/ui/static/js/utils/form.js b/src/ui/static/js/utils/form.js index 6ca0bda51..e003866c9 100644 --- a/src/ui/static/js/utils/form.js +++ b/src/ui/static/js/utils/form.js @@ -57,6 +57,24 @@ class Select { } init() { + // Add event listener to close dropdown if scroll event is triggered on window + window.addEventListener("scroll", () => { + this.dropsToHide = document.querySelectorAll( + '[data-setting-select-dropdown][class*="flex"]', + ); + if (!this.dropsToHide.length) return; + + this.dropsToHide.forEach((dropdown) => { + const btn = dropdown + .closest("div[data-setting-container]") + .querySelector("button[data-setting-select]"); + + if (dropdown.classList.contains("hidden")) return; + btn.click(); + // Add dropdown to remove list + }); + }); + window.addEventListener("click", (e) => { //CASE NO BTN SELECT CLICKED try { @@ -164,6 +182,28 @@ class Select { dropdownEl.classList.toggle("hidden"); dropdownEl.classList.toggle("flex"); dropdownChevron.classList.toggle("rotate-180"); + // case open, we want to move dropdown position next to his data-select-container + if (!dropdownEl.classList.contains("hidden")) { + const selectContainer = btn.closest("div[data-select-container]"); + const selectContainerRect = selectContainer.getBoundingClientRect(); + const top = selectContainerRect.top + selectContainerRect.height; + const left = selectContainerRect.left; + const width = selectContainerRect.width; + dropdownEl.style.top = `${top}px`; + dropdownEl.style.left = `${left}px`; + dropdownEl.style.width = `${width}px`; + // Check dropdown height, if out of screen, move it up + const dropdownRect = dropdownEl.getBoundingClientRect(); + const dropdownHeight = dropdownRect.height; + const dropdownBottom = dropdownRect.bottom; + const windowHeight = window.innerHeight; + + if (dropdownBottom > windowHeight) { + dropdownEl.style.top = `${ + top - dropdownHeight - selectContainerRect.height - 15 + }px`; + } + } } } diff --git a/src/ui/static/js/utils/settings.js b/src/ui/static/js/utils/settings.js index 8eeb191bb..93ac90a35 100644 --- a/src/ui/static/js/utils/settings.js +++ b/src/ui/static/js/utils/settings.js @@ -220,13 +220,19 @@ class TabsSelect { ); const combobox = dropdown.querySelector("[data-combobox]"); if (combobox) { - // simulate clear combobox wit keyboard + // simulate clear combobox with keyboard combobox.value = ""; } dropdown.classList.toggle("hidden"); dropdown.classList.toggle("flex"); + // Case open, try to focus on combobox input - if (!dropdown.classList.contains("hidden") && combobox) { + // Unless already input focused (avoid conflict with search) + if ( + !dropdown.classList.contains("hidden") && + combobox && + combobox.getAttribute("data-focus") !== "false" + ) { combobox.focus(); } @@ -288,6 +294,9 @@ class FilterSettings { this.tabsEls = this.tabContainer.querySelectorAll( `[data-tab-select-handler]`, ); + this.comboboxEl = this.tabContainer + .querySelector("[data-tab-select-dropdown]") + .querySelector("[data-combobox]"); this.init(); } @@ -300,11 +309,13 @@ class FilterSettings { }); } + // Update plugin items based on current input if (this.comboboxEl) { this.comboboxEl.addEventListener("input", () => { this.runComboFilter(); }); + // Allow to run combobox filter when opening dropdown (because reset and focus on open) this.comboboxEl.addEventListener("focusin", () => { this.runComboFilter(); }); @@ -352,7 +363,13 @@ class FilterSettings { } runFilter() { + // Reset previous state to start fresh this.resetFilter(); + // get current tab, this will be used to show other plugin tab if current is hidden after filter + const tabNameBeforeFilter = + this.tabContainer + ?.querySelector("[data-tab-select-dropdown-btn]") + ?.getAttribute("data-tab-id") || ""; //get inp format const inpValue = this.input.value.trim().toLowerCase().replaceAll("_", " "); @@ -612,37 +629,74 @@ class FilterSettings { // case no tab match if (isAllHidden) { + // we want to show message "No match" this.tabContainer .querySelector("[data-tab-select-dropdown-btn]") .setAttribute("data-tab-id", "no-match"); - return (this.tabContainer.querySelector( + this.tabContainer.querySelector( "[data-tab-select-dropdown-btn] span", - ).textContent = "No match"); + ).textContent = "No match"; + // we want to close dropdown in case open previously + this.toggleDropdown(true, true, false); + return; } - // click first not hidden tab - const currTabEl = this.tabContainer.querySelector( + // case at least one match + const currTabBtn = this.tabContainer.querySelector( + `[data-tab-select-handler='${tabNameBeforeFilter}']`, + ); + + // case the previous plugin is still visible, set is as active by clicking it again + if (currTabBtn && !currTabBtn.classList.contains("!hidden")) { + currTabBtn.click(); + } + + // case the previous plugin is hidden, click on the first not hidden tab + if (currTabBtn?.classList?.contains("!hidden") || !currTabBtn) { + firstNotHiddenEl.click(); + } + + // furthermore, open dropdown so user can see remain plugins in case the first one is not the one he is looking for + // and if more than one plugin available + // but we want to avoid dropdown open if active element is input keyword and value is empty + if (document.activeElement === this.input && this.input.value === "") + return; + + const hiddenTabsEl = this.tabContainer.querySelectorAll( + `[data-tab-select-handler][class*="!hidden"]`, + ); + + if (hiddenTabsEl.length < this.tabsEls.length - 1) + this.toggleDropdown(true, false, true); + return; + } + + toggleDropdown( + avoidComboFocus = false, + disableOpen = false, + disableClose = false, + ) { + // avoid this on mobile + if (window.innerWidth < 768) return; + const dropdownEl = this.tabContainer.querySelector( + "[data-tab-select-dropdown]", + ); + const dropdownBtn = this.tabContainer.querySelector( "[data-tab-select-dropdown-btn]", ); - - const currTabName = currTabEl.getAttribute("data-tab-id"); - - // case previously no match - if (currTabName === "no-match" && !isAllHidden) { - return firstNotHiddenEl.click(); - } - - const currTabBtn = this.tabContainer.querySelector( - `[data-tab-select-handler='${currTabName}']`, - ); - - if (!currTabBtn.classList.contains("!hidden")) { - return currTabBtn.click(); - } - - if (currTabBtn.classList.contains("!hidden")) { - return firstNotHiddenEl.click(); - } + if (this.comboboxEl && avoidComboFocus) + this.comboboxEl.setAttribute("data-focus", "false"); + let canClick = true; + // check if can click based on next dropdown state + if (disableClose && !dropdownEl.classList.contains("hidden")) + canClick = false; + if (disableOpen && dropdownEl.classList.contains("hidden")) + canClick = false; + if (canClick) dropdownBtn.click(); + // Case avoid focus on combobox, we need to reset here because the focusin event is not triggered + if (this.comboboxEl && avoidComboFocus) this.runComboFilter(); + // Reset to default state + if (this.comboboxEl) this.comboboxEl.setAttribute("data-focus", "true"); } resetFilter() { diff --git a/src/ui/styles.css b/src/ui/styles.css index 76b7b3feb..45e60c09b 100644 --- a/src/ui/styles.css +++ b/src/ui/styles.css @@ -286,6 +286,14 @@ @apply transition duration-300 ease-in-out mb-0 font-sans text-sm leading-normal dark:text-gray-300; } +.core-card-text-doc { + @apply transition duration-300 ease-in-out mb-0 font-sans text-sm leading-normal dark:text-gray-300 px-1 mt-4 mb-2; +} + +.core-card-text-doc-link { + @apply hover:brightness-90 cursor-pointer mt-2 underline text-sky-500; +} + .center.core-card-text { @apply text-center; } @@ -343,7 +351,15 @@ } .core-card-list { - @apply ml-2 mr-2 mb-2 mt-2 h-fit content-start md:col-span-6 overflow-x-hidden overflow-y-auto grid grid-cols-12 max-h-100 sm:max-h-125 col-span-12 p-4 relative break-words dark:brightness-110 bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border; + @apply ml-2 mr-2 mb-2 mt-2 content-start md:col-span-6 overflow-x-hidden overflow-y-auto grid grid-cols-12 max-h-100 sm:max-h-125 col-span-12 p-4 relative break-words dark:brightness-110 bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border; +} + +.core-card-list.no-data { + @apply place-content-stretch; +} + +.core-card-list-no-data { + @apply pb-[2rem] text-2xl text-center mb-0; } .w-small.core-card-list { @@ -522,6 +538,10 @@ @apply text-sm tracking-wide dark:brightness-90 inline-block px-6 py-3 font-bold text-center text-white uppercase align-middle transition-all rounded-lg cursor-pointer bg-yellow-500 hover:bg-yellow-500/80 focus:bg-yellow-500/80 leading-normal ease-in shadow-xs hover:-translate-y-px active:opacity-85 hover:shadow-md disabled:cursor-not-allowed dark:disabled:text-gray-300 disabled:text-gray-700 disabled:bg-gray-400 disabled:border-gray-400/0 dark:disabled:bg-gray-700 dark:disabled:border-gray-700/0 disabled:hover:translate-y-0 disabled:hover:bg-gray-400 disabled:hover:border-gray-400/0 dark:disabled:hover:translate-y-0 dark:disabled:hover:bg-gray-700 dark:disabled:hover:border-gray-700/0; } +.core-card-upload-btn { + @apply w-fit disabled:hover:translate-y-0 disabled:cursor-not-allowed disabled:opacity-75 dark:disabled:text-gray-300 disabled:text-gray-700 disabled:bg-gray-400 disabled:border-gray-400 dark:disabled:bg-gray-800 dark:disabled:border-gray-800 tracking-wide dark:brightness-125 hover:brightness-75 inline-block px-6 py-3 font-bold text-center text-white uppercase align-middle transition-all rounded-lg cursor-pointer bg-gradient-to-tl bg-primary leading-normal text-xs ease-in shadow-xs bg-150 bg-x-25 hover:-translate-y-px active:opacity-85 hover:shadow-md; +} + .core-card-test-status-container { @apply mx-1 flex justify-center items-center; } diff --git a/src/ui/tailwind.config.js b/src/ui/tailwind.config.js index ba41318be..ba1103e4d 100644 --- a/src/ui/tailwind.config.js +++ b/src/ui/tailwind.config.js @@ -70,6 +70,7 @@ module.exports = { "text-yellow-500", "text-green-500", "text-red-500", + "text-sky-500", ], presets: [], diff --git a/src/ui/templates/account.html b/src/ui/templates/account.html index 440826501..3de49b053 100644 --- a/src/ui/templates/account.html +++ b/src/ui/templates/account.html @@ -103,7 +103,9 @@

{{ pro_services }} services allowed

{% endif %} {% if pro_expire %} -

License expiration date : {{ pro_expire }}

+

+ License expiration date : {{ pro_expire }} +

{% endif %}
{% endif %} @@ -115,60 +117,66 @@
{% endif %}
-
-
-
{%if is_pro_version %}UPDATE KEY {% else %} ACTIVATE KEY {% endif %}
+ +
+
+ {% if is_pro_version %} + UPDATE KEY + {% else %} + ACTIVATE KEY + {% endif %} +
+
+ + + +
+
License key
+ + +
+ +
- - - -
-
License key
- - -
- - -
-
-
- -
- +
+
+ +
+
+ + +
@@ -251,6 +248,7 @@
@@ -155,7 +147,7 @@
+ class="min-h-[55vh] max-h-80 overflow-auto p-4 col-span-12 relative min-w-0 break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
LIST
{% for plugin in plugins %} diff --git a/src/ui/templates/reports.html b/src/ui/templates/reports.html index 82393fa90..2723960b5 100644 --- a/src/ui/templates/reports.html +++ b/src/ui/templates/reports.html @@ -4,7 +4,15 @@ {% set codes = ["all"] %} {% set reasons = ["all"] %} {% set countries = ["all"] %} + {% set reasons_count = {} %} + {% set codes_count = {} %} + {% set countries_count = {} %} + {% set methods_count = {} %} {% for report in reports %} + {% if reasons_count.update({report["reason"]|string : reasons_count.get(report["reason"], 0) + 1}) %}{% endif %} + {% if codes_count.update({report["status"]|string : codes_count.get(report["status"], 0) + 1}) %}{% endif %} + {% if countries_count.update({report["country"]|string : codes_count.get(report["country"], 0) + 1}) %}{% endif %} + {% if methods_count.update({report["method"]|string : methods_count.get(report["method"], 0) + 1}) %}{% endif %} {% if report["method"] not in methods %} {% if methods.append(report["method"]) %}{% endif %} {% endif %} @@ -18,6 +26,31 @@ {% if countries.append(report["country"]) %}{% endif %} {% endif %} {% endfor %} + {% set top_reason = {"count": 0, "name": "unknown"} %} + {% for key, value in reasons_count.items() %} + {% if value|int > top_reason["count"]|int %} + {% if top_reason.update({"count": value, "name" : key|string}) %}{% endif %} + {% endif %} + {% endfor %} + {% set top_code = {"count": 0, "name": "unknown"} %} + {% for key, value in codes_count.items() %} + {% if value|int > top_code["count"]|int %} + {% if top_code.update({ "count" : value|string, "name" : key}) %}{% endif %} + {% endif %} + {% endfor %} + {% set top_country = {"count": 0, "name": "unknown"} %} + {% for key, value in countries_count.items() %} + {% if value|int > top_country["count"]|int %} + {% if top_country.update({ "count" : value|string, "name" : key}) %}{% endif %} + {% endif %} + {% endfor %} + {% set top_method = {"count": 0, "name": "unknown"} %} + {% for key, value in methods_count.items() %} + {% if value|int > top_method["count"]|int %} + {% if top_method.update({ "count" : value|string, "name" : key}) %}{% endif %} + {% endif %} + {% endfor %} + {% set total_report = reports|length %}
{% if reports|length != 0 %} {% set reports_info = [ - {"name" : "REPORTING TOTAL", "data" : total_report|string}, - {"name" : "TOP REASON", "data" : total_reason|string}, - {"name" : "TOP STATUS CODE", "data" : top_code|string}, + {"name" : "REPORTING TOTAL", "data" : total_report|string or "0"}, + {"name" : "TOP METHOD", "data" : top_method['name']|string}, + {"name" : "TOP REASON", "data" : top_reason['name']|string}, + {"name" : "TOP COUNTRY", "data" : top_country['name']|string}, + {"name" : "TOP STATUS CODE", "data" : top_code['name']|string}, ] %}
INFO
- {% for info in reports_info %} -
-

- {{ info['name'] }} -

-

- {{ info['data'] }} -

-
+ {% for info in reports_info %} +
+

{{ info['name'] }}

+

{{ info['data'] }}

+
{% endfor %}
diff --git a/src/ui/templates/services.html b/src/ui/templates/services.html index e67bb25b7..d895f5fa9 100644 --- a/src/ui/templates/services.html +++ b/src/ui/templates/services.html @@ -48,17 +48,10 @@
INFO
{% for info in services_info %} -
-

- {{ info['name'] }} -

-

- {{ info['data'] }} -

-
+
+

{{ info['name'] }}

+

{{ info['data'] }}

+
{% endfor %}
diff --git a/src/ui/templates/services_modal.html b/src/ui/templates/services_modal.html index e6b29645a..47fe747ed 100644 --- a/src/ui/templates/services_modal.html +++ b/src/ui/templates/services_modal.html @@ -42,130 +42,10 @@
-
-
-
{% include "settings_tabs_select.html" %}
-
- -
- - - -
- - - - -
- -
-
-
-
-
- - -
- - - - - {% include "settings_plugins.html" %} - -
-
- - -
- - -
-
- - -
- - - - -
-

-

-
- -
- - -
- -
-
diff --git a/src/ui/templates/services_modal_delete.html b/src/ui/templates/services_modal_delete.html new file mode 100644 index 000000000..9611f150d --- /dev/null +++ b/src/ui/templates/services_modal_delete.html @@ -0,0 +1,24 @@ + +
+ + + + +
+

+

+
+ +
+ + +
+ +
+ \ No newline at end of file diff --git a/src/ui/templates/services_modal_settings_advanced.html b/src/ui/templates/services_modal_settings_advanced.html new file mode 100644 index 000000000..7be9c6262 --- /dev/null +++ b/src/ui/templates/services_modal_settings_advanced.html @@ -0,0 +1,115 @@ +
+
+
{% include "settings_tabs_select.html" %}
+
+ +
+ + + +
+ + + + +
+
+
+
+
+
+ + +
+ + + + + {% include "settings_plugins.html" %} + +
+
+ + +
+ + +
+
\ No newline at end of file diff --git a/src/ui/templates/services_modal_settings_simple.html b/src/ui/templates/services_modal_settings_simple.html new file mode 100644 index 000000000..9544d624a --- /dev/null +++ b/src/ui/templates/services_modal_settings_simple.html @@ -0,0 +1,35 @@ + +
+
+

+

+
+
+
+
+
+ + +
+ + + + + + + +
+
+ + +
+ + +
+
diff --git a/src/ui/templates/settings_plugins.html b/src/ui/templates/settings_plugins.html index 37571aca1..fa8692804 100644 --- a/src/ui/templates/settings_plugins.html +++ b/src/ui/templates/settings_plugins.html @@ -1,7 +1,7 @@ {% set current_endpoint = current_endpoint or url_for(request.endpoint)[1:].split("/")[-1].strip().replace('_', '-') %} {% for plugin in plugins %} -
@@ -192,7 +192,7 @@